等待多个线程时的最佳实践 - 时间、计数还是其他?

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 个可互换的工作线程?

【讨论】:

以上是关于等待多个线程时的最佳实践 - 时间、计数还是其他?的主要内容,如果未能解决你的问题,请参考以下文章

多线程处理数据库记录的最佳实践

DLL 注入的最佳实践?

AQS的几个同步组件

多线程 - CountDownLatch

使用“SQlDataAdapter”时的最佳实践

Java多线程协作CountDownLatch,主线程等待子线程结束