0

此外wait/notify,还有更简洁的线程间事件通知方式吗?
例如,如果我想Thread X通知ThreadY发生了什么事情,在并发包中是否有比在上面构建更好的构造wait/notify
我的要求很简单: ThreadB期望事件发生。ThreadA负责检测此类更改。发生变化时ThreadA通知ThreadB

更新:
我需要做观察者/观察者模式,但我希望观察者在通过循环通知观察者时尽可能少地阻塞。
即观察者将是单独的线程,并且可观察到的火变化将“通知”它们以尽可能少地阻塞

4

6 回答 6

0

如果您不想引入任何复杂的数据结构而只是通知线程,那么您还可以查看中断线程。消费者线程并循环运行,当被中断时,它们执行处理,然后再次退出/循环运行。

于 2014-08-27T10:08:44.210 回答
0

如果您不想阻止观察者(因为他们正忙于其他任务),那么您需要实现某种轮询机制。您不能只是神奇地调用另一个未被阻塞的线程中的方法,因为另一个线程有自己的顺序逻辑。

最简单的轮询解决方案是将 volatile 变量设置为特殊值,并定期从观察者线程检查该变量。

于 2013-02-26T15:26:21.660 回答
0

您可以使用ExecutorService 。它从Executor扩展而来 ,它提供了管理终止的方法和可以产生 Future 以跟踪一个或多个异步任务的进度的方法。在您描述的线程间通信这样的情况下使用它非常简单。

于 2013-02-26T13:34:34.567 回答
0

不要写等待/通知。使用 java.concurrent 工具。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html

例如,如果未绑定队列适合您的要求,则使用 ConcurrentLinkedQueue: http ://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

顺便说一句,最好的选择是通过使用期货和演员来完全避免手动管理线程。

于 2013-02-26T13:27:29.680 回答
0

不幸的是,您的要求仍然含糊不清。您可以将三个主要的并发原语用于更高级别的通知,然后是等待/通知和等待/信号。

你可以有一个等待线程完成的屏障,一个等待来自另一个线程的消息的屏障,或者你可以有一个等待事件的多个线程的屏障。

您可以使用CyclicBarrier,CountdownLatchPhaser.

对于第二个,您可以使用任何 BlockingQueue,无论是LinkedBlockingQueue、还是。ArrayBlockingQueueSynchronousQueueTransferQueue

最后,您可以使用ExecutorService+ Future

下一个问题:

究竟什么是事件以及正在发生什么变化?这很重要,如果字段正在更改,您可以使用SettableFuture支持您的字段/事件更新

编辑:

你能包括一个新的图书馆。看来Akka很适合你。

于 2013-02-26T13:38:52.990 回答
0

java.util.concurrent.locks 包类 Lock、Condition 和其他类可以更好地控制线程协调。

于 2013-02-26T13:39:53.223 回答