编程语言
首页 > 编程语言> > java-我如何在一个对象上等待,然后在另一个对象上使用notifyAll?

java-我如何在一个对象上等待,然后在另一个对象上使用notifyAll?

作者:互联网

我认为我面临的问题是嵌套监视器锁定的一种变体.基本上,我有两组线程(不是ThreadGroups,只是逻辑组).一组线程(例如,后台组)将在对象上等待,而另一组线程在工作(工作组).工作线程一个接一个地完成,直到最后一个工作线程处于“ complete”方法中.我想做的是弄清楚告诉最后一个工作线程等待的方法,然后调用notifyAll()唤醒所有后台线程.您可能会猜到,两组线程正在来回切换-一组正在工作,而另一组正在等待,然后又在切换.问题是,如果我在当前等待的线程上使用notifyAll(),则无法保证最终的工作线程将在通知的线程完成并尝试启动下一个交换之前将其进入wait()调用.

很抱歉,如果这个问题有点少-似乎我从事并发工作的次数越多,我的代码就越复杂:(

解决方法:

您可以尝试将线程组与Exchanger连接.传统上,它用于在交替工作的两个线程之间来回传输工作.如果您可以正确进行传输,则似乎也可以使它适用于线程组.

如果每个组都有一个控制器线程怎么办?然后,当他在Exchanger中收到项目时,您可以在他的组中使控制器notifyAll,然后加入他自己的所有组.当所有联接返回时,他可以将控制权交还给Exchanger.

或者,如果每个组中的线程数是固定的,则可以为具有固定线程数的组创建CyclicBarrier,然后指定当所有线程完成并达到障碍时要运行的障碍操作.该动作可以通过Exchanger或SynchronousQueue(强制执行同步协调的0长度队列)来转移控制.

有关同步器的更多信息,请查看Java Concurrency in PracticeDZone concurrency refcard.

标签:concurrency,locking,monitoring,deadlock,java
来源: https://codeday.me/bug/20191208/2095278.html