如果可能,协调线程而不等待/通知

时间:2013-02-26 13:22:58

标签: java multithreading events concurrency java.util.concurrent

除了wait/notify之外,还有一种更简洁的方式来通知线程之间的事件吗? 例如。如果我希望Thread X通知ThreadY发生的事情是并发包中有更好的构造而不是在wait/notify之上构建它吗? 我的要求很简单: ThreadB期待事件发生。 ThreadA负责检测此类更改。发生更改时ThreadA会通知ThreadB

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

6 个答案:

答案 0 :(得分:0)

请勿使用wait / notify编写。 使用java.concurrent utils。 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

BTW最佳选择是避免使用期货和演员来手动管理线程。

答案 1 :(得分:0)

您可以使用ExecutorService。它是从Executor扩展而来的,它提供了管理终止的方法和可以生成Future以跟踪一个或多个异步任务进度的方法。它非常简单在你所描述的情况下使用Inter Thread Communication

答案 2 :(得分:0)

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

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

对于furst,您可以使用CyclicBarrierCountdownLatchPhaser

对于第二个,您可以使用任何BlockingQueue,无论LinkedBlockingQueueArrayBlockingQueueSynchronousQueue还是TransferQueue

最后,您可以使用ExecutorService + Future

下一个问题:

什么是事件,什么是变化?这一点很重要,如果字段正在更改,您可以使用SettableFuture

支持字段/事件更新

编辑:

您可以添加新库吗?看起来Akka可以很好地为您服务。

答案 3 :(得分:0)

java.util.concurrent.locks包类Lock,Condition等可以更好地控制线程协调。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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