【问题标题】:Events between threads in java [duplicate]java中线程之间的事件[重复]
【发布时间】:2015-05-17 19:04:55
【问题描述】:

我从同一个进程创建了两个线程,它们是两个不同服务器/客户端聊天中的服务器。我想要的是:当一个服务器中发生特定事件(如按下按钮)时,该线程必须以某种方式通知另一个线程。有没有办法为此目的使用 java 事件?有替代方案吗?

编辑: 除了一直检查方法内部的变量之外,还有其他方法吗?我在考虑类似 C 语言中的信号之类的东西,例如,您可以使用信号处理程序异步处理信号。

【问题讨论】:

  • 如果您想对我的问题投反对票,那很好,但是在 cmets 中写下您这样做的原因会很有帮助,这样我可以理解并在将来提出更好的问题。跨度>

标签: java


【解决方案1】:

事件总线/消息总线

事件总线(又名消息总线)是一种简单的方法,可以让对象间接调用彼此的代码,而无需显式地相互引用。

一些对象通过注册消息总线对象来注册它们对某些类型的事件/消息的兴趣。生成此类事件/消息的对象通过调用消息总线来发布它们。然后该消息遍历所有注册者以调用带有特定注释标记的特定方法。

Google Guava 提供了这样一个事件总线。但我不推荐它,因为他们莫名其妙地使用了强引用。这意味着您必须始终严格地取消注册任何本应符合垃圾收集条件的订阅对象。

我确实建议使用MBassador 项目。默认情况下,它使用弱引用。您可以轻松地异步调用它。

消息队列

message queue 是让对象彼此匿名通信的另一种方式。但是消息队列在一些方面与事件总线不同。

  • 消息队列通常具有一小段文本的有效负载,而不是对象。
  • 消息队列是被动的,将消息排队并等待其他对象/系统查询新消息。事件总线是活动的,因为它在每个注册的订阅者方法上调用一个方法。
  • 消息队列通常在应用程序外部,是一个单独的进程,用于不同的系统进行通信。但是,如果您愿意,您可以在您的应用中创建一个消息队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多