编程上下文中的所有“事件”是否都是异步的?

时间:2013-11-11 09:22:24

标签: java events

在我的应用程序中,我将记录一些特殊行以指示某些状态更改,例如

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");

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

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();
    }
}

但是当我的朋友审查我的代码时,他说我不应该把它称为“事件”,因为它不是“异步”。当他看到名字event时,他希望它来自另一个线程,但在我的代码中,我只是逐个解析它。

我现在很困惑。当我们在编程中说event时,我们是否认为它是“异步的”?那么没有“同步”事件?

3 个答案:

答案 0 :(得分:1)

我认为名字还可以。例如,Log4j具有LoggingEvent类。考虑使用枚举

也是有意义的
enum LoggingEvent {
  NewFile,
  ...
}

答案 1 :(得分:1)

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

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

另见http://docs.oracle.com/javase/tutorial/uiswing/events/index.html

因此名称'event'本身不会自动表示'异步'。

答案 2 :(得分:1)

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