0

在我的应用程序中,我将记录一些特殊行来指示一些状态变化,例如

logger.info("Read file abc.txt completed from upstream system");
logger.info("The content of file abc.txt is valid");
logger.info("The content of abc.txt has been saved to db");

然后我监视日志文件,当找到上面的任何一行时,我为它们创建了一个“事件”实例:

class NewFileEvent() {}
class ValidationEvent() {}
class PersistEvent() {}

while(true) {
    String nextLine = readNextLineFromLog();
    if("Read file abc.txt completed from upstream system".equals(nextLine)) {
        return new NewFileEvent();
    } else if("The content of file abc.txt is valid".equals(nextLine)) {
        return new ValidationEvent();
    } else if("The content of abc.txt has been saved to db".equals(nextLine)) {
        return new PersistEvent();
    }
}

但是当我的朋友查看我的代码时,他说我不应该将其称为“事件”,因为它不是“异步”的。当他看到 nameevent时,他希望它来自另一个线程,但是在我的代码中,我只是在循环中一个一个地解析它。

我现在很困惑。当我们说某些东西正在event编程中时,我们是否假设它“异步”?那么没有“同步”事件吗?

4

3 回答 3

1

事件只是一个对象。问题是,发送/接收/处理事件是同步的还是异步的。或者换句话说:用于发送事件的方法是阻塞,直到事件被处理,还是立即返回?而且,如果两个事件已被“发送”,它们是并行处理还是顺序处理?

在 Java 中,事件通常由事件侦听器处理,因此您在某处注册一个事件侦听器,该事件侦听器充当回调,一旦事件发生就会得到通知。这通常不是异步的,因此事件在同一线程中一个接一个地传递给所有侦听器。在这种情况下不建议使用多线程。它通常没有任何优势,并且会使一切变得更加复杂和容易出错。

另请参阅http://docs.oracle.com/javase/tutorial/uiswing/events/index.html

因此,“事件”这个名称本身并不意味着“异步”。

于 2013-11-11T09:41:47.740 回答
1

我觉得名字还可以。例如 Log4j 有 LoggingEvent 类。考虑使用枚举也很有意义

enum LoggingEvent {
  NewFile,
  ...
}
于 2013-11-11T09:35:05.117 回答
1

Hibernate 使用相同的方法。事件对象是在用户想要执行某些操作时创建的,然后立即传递给事件侦听器。它是同步工作的,因此事件对象仅用于传输一些数据。

于 2013-11-11T09:44:30.047 回答