【问题标题】:sending and receiving events in Java threads在 Java 线程中发送和接收事件
【发布时间】:2014-07-19 13:48:42
【问题描述】:

我已经习惯了 C++/Qt 的信号概念(发射/收听),现在我正在用 Java 做一个需要某种数据发送/接收机制的项目。

我的需求是:

  • 发出一个事件(带有一些数据)并让所有线程监听/捕捉它。
  • 显然,鉴于之前的要求,能够侦听/捕获带有附加数据的信号。

这在 Java 中是否可行,如何实现? (我会欣赏一个小的可编译示例/链接)

【问题讨论】:

  • 为什么不能使用观察者设计模式?您的应用程序中可能存在不符合观察者设计模式的特定要求,但除非我了解所有要求,否则我无法确定
  • @user3790568 因为我想广播信号,这不太适合观察者模式(除非我做了一些非常骇人听闻的事情,我宁愿避免)
  • 也许您可以在空闲线程上使用 wait() 来等待 notifyAll()?这样,您可以检查是否有任何更改,然后在适当的情况下发出事件。不确定这对你来说是否是“hacky”。​​

标签: java multithreading events


【解决方案1】:

默认情况下,Java 没有简单的事件处理机制,例如 .Net 的事件或 Qt 的信号和插槽。它确实在各种 java GUI 框架中具有侦听器的概念,但我认为这不是您要寻找的。​​p>

您应该考虑使用像 Google Guava's EventBus framework 这样的 pub-sub 库。

如果您不想使用第三方库,那么我建议您开始研究使用BlockingQueue 的子类之一。请参阅Java Concurrency in Practice 第 62 页中的FileCrawler example,了解如何使用 BlockingQueue 将事件/数据发送到工作线程。

如果您正在为跨进程边界或本地机器边界的消息/事件通知寻找更复杂的解决方案,那么您可能需要研究:

【讨论】:

    【解决方案2】:

    不确定这是否与您的确切查询匹配,但您是否尝试过 CountDownLatch 或 CyclicBarrier?

    http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

    http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html

    【讨论】:

    • 那些不是我想要的。这两种方法都需要在某个时候“等待”(完成某些操作或同步线程),而我正在寻找的只是一个基于事件的解决方案(这样我就可以在任何时候发出/监听信号)
    猜你喜欢
    • 2017-07-05
    • 2016-08-31
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多