等待多个线程时的最佳实践 - 时间、计数还是其他?
Posted
技术标签:
【中文标题】等待多个线程时的最佳实践 - 时间、计数还是其他?【英文标题】:Best practice when waiting for multiple threads - time, count or something else? 【发布时间】:2014-12-29 23:32:04 【问题描述】:我的应用程序将在运行时包含多个线程(在本例中为 7),它们执行独立的工作。但是,每隔一段时间,线程就必须同步它们的数据。
这将由调用 DataSynchronizer 对象的线程完成,它们都引用了该对象。
我在这门课中对流的想法是这样的:
public class DataSynchronizer
public void synchronizeData(List<Data> threadData)
// Wait for all 7 threads to call this method
// When all 7 are here, hold them here & do work using one of the threads
// or a new anonymous thread
// Release the threads & let them continue their independent work
我的问题是,在进行同步工作之前“等待所有 x 个线程”的最佳方式是什么?
我知道所有线程都会在 1 秒内调用 synchronizeData 方法,最多 2 秒。
我也是,
1) 在第一个线程调用该方法后等待 2s 并假设所有线程现在也已到达?或
2) 保持计数以确保所有活动线程都已到达? (如果线程在调用方法之前崩溃,应用程序将永远等待)
3) 计数 + 超时?
4) ???
【问题讨论】:
您可以使用值为 7 的 CountDownLatch.. When setting a form's opacity should I use a decimal or double?的可能重复 【参考方案1】:这就是CyclicBarrier 的用途。它允许您定义线程将等待直到所有线程到达的位置,然后可选地运行Runnable
来执行同步或其他类似的事情。
【讨论】:
CountDownLatch
在这里会不会更合适?我的意思是他不必重置计数对吗?
由于他似乎想要执行多次同步,CyclicBarrier
似乎是更明显的选择。
哦。没看到 几次 部分.. :)
谢谢,正是我想要的。 @TheLostMind 是的,每隔几分钟同步一次 :)【参考方案2】:
我认为你需要一个 java.util.concurrent.CyclicBarrier。
【讨论】:
【参考方案3】:-
假设和线程是一种非常危险的方法。
等待永恒有多糟糕?对我来说听起来很不方便。
如果你达到了超时,你能做一些有用的事情吗?让程序崩溃,重新启动错误的线程,假设它在做什么?
后续问题:
如果线程不参与同步会发生什么? 如果同步延迟会怎样? 您的方法应该区分一个线程和另一个线程,还是它们只是 7 个可互换的工作线程?【讨论】:
以上是关于等待多个线程时的最佳实践 - 时间、计数还是其他?的主要内容,如果未能解决你的问题,请参考以下文章