Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果可能,在不等待/通知的情况下协调线程_Java_Multithreading_Events_Concurrency_Java.util.concurrent - Fatal编程技术网

Java 如果可能,在不等待/通知的情况下协调线程

Java 如果可能,在不等待/通知的情况下协调线程,java,multithreading,events,concurrency,java.util.concurrent,Java,Multithreading,Events,Concurrency,Java.util.concurrent,除了wait/notify之外,线程之间是否有更干净的事件通知方式? 例如,如果我想Thread X通知ThreadY发生了什么事情,那么在并发包中是否有比在wait/notify之上构建更好的构造? 我的要求很简单: ThreadB预期会发生事件线程a负责检测此类更改。当发生更改时,ThreadA通知ThreadB 更新: 我需要执行观察者/可观察模式,但我希望可观察者在循环中通知观察者时,尽可能少地阻塞。 也就是说,观察者将是独立的线程,可观察到的着火变化将“通知”他们,以便尽可能少地阻止他

除了
wait/notify
之外,线程之间是否有更干净的事件通知方式?
例如,如果我想
Thread X
通知
ThreadY
发生了什么事情,那么在并发包中是否有比在
wait/notify
之上构建更好的构造?
我的要求很简单:
ThreadB
预期会发生事件<代码>线程a负责检测此类更改。当发生更改时,ThreadA通知
ThreadB

更新:
我需要执行观察者/可观察模式,但我希望可观察者在循环中通知观察者时,尽可能少地阻塞。

也就是说,观察者将是独立的线程,可观察到的着火变化将“通知”他们,以便尽可能少地阻止他们

不要使用wait/notify写入。 使用java.concurrent utils。

例如,如果未绑定队列适合您的需求,则使用ConcurrentLinkedQueue:


顺便说一句,最好的选择是通过使用未来和参与者来避免手动管理线程

您可以使用。它的扩展提供了管理终止的方法和可以产生未来跟踪一个或多个异步任务进度的方法。在您描述的情况下使用它非常简单。

不幸的是,您的需求仍然模糊不清。有三个主要的并发原语,您可以在更高的级别上用于通知,然后是wait/notify&wait/signal

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

对于furst,您可以使用
循环载波
倒计时闩锁
相位器

对于第二种情况,您可以使用任何阻塞队列,无论是
LinkedBlockingQueue
ArrayBlockingQueue
SynchronousQueue
还是
TransferQueue

最后,您可以使用
执行器服务
+
未来

下一个问题:

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

编辑:


你能包括一个新的图书馆吗。它似乎可以很好地为您工作。

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


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

如果您不想引入任何复杂的数据结构,而只是通知线程,那么您也可以考虑中断线程。使用者线程和在循环中运行,当中断时,它们将停止处理,然后再次退出/在循环中运行

你能详细说明你的要求吗?您在
java.util.concurrent
(例如,
CyclicBarrier
CountdownLatch
?您需要传递信息,还是只传递通知本身?更好的方法?java有信号量,IIRC。@JonSkeet:请参阅更新。您提到的那些构造是关于一起启动线程等的,对吗?@MartinJames:我的意思是如果有一个比wait/notify I更高级别的构造要使用它,没有什么比等待/通知更好的了。就这样做。Simple.ConcurrentLinkedQueue确实不是这里使用得最好的队列。它是线程安全的,但没有等待语义。但我不需要队列。只需要通知mechanism@Jim如果我没弄错的话,你说的是这个设计没错。但是我需要通知你在一个单独的线程中完成,这样就不会阻塞可观察对象。只需在您写入的第二个线程中通知并返回:
等待另一个线程消息的屏障似乎正是我所需要的。但是如何使用队列呢?我在这里不需要队列。我也不确定还要写什么clearer@Jim当你说
更新到noti时fy
被通知的线程需要更新线程的结果,还是只需要被通知它可以启动某个东西。