2010-09-29 53 views
7

我看到一個stackoverflow成員建議使用Thread.join()讓一個「主」線程等待2個「任務」線程完成。CountDownLatch的latch.await()方法vs Thread.join()

我會經常做一些不同的事情(如下所示),我想知道我的方法是否有問題。

final CountDownLatch latch = new CountDownLatch(myItems.length); 

for (Item item : myItems) { 
    //doStuff launches a Thread that calls latch.countDown() as it's final act 
    item.doStuff(latch); 
} 

latch.await(); //ignoring Exceptions for readability 

回答

8

您的解決方案更容易擴展。 Thread.join()是在CountdownLatch和其他同步器創建之前解決您的問題的完美方式。

在可讀性方面,我會選擇CountdownLatch方法來加入每個線程。這也允許您更改Item的實現,以便提交給Executor服務,而不是直接使用Threads。

0

倒計時鎖存器是首選同時啓動所有線程。

8

我寧願使用Future(如果您使用的是ExecutorService,則更容易)。然後在提交完所有任務後等待它們全部完成。

Collection<Future<Void>> futures = new ArrayList<Future<Void>>(myItems.length()); 
for (Runnable item : myItems) { 
    futures.add(executor.submit(item, null)); 

for (Future<Void> future : futures) 
    future.get(); //easy to add a timeout here 

最終的for-loop可以很容易地分解成一個utily方法。這封裝了同步並使添加超時變得很容易。

它也適用於一般情況下,工作線程實際上需要返回結果。 (如果你不關心工作線程最終會做什麼,爲什麼你需要等待它們?)

+0

我一直以爲我應該看看Future類?/ inteface? – Ivan 2010-09-29 18:07:52

+0

我想了解什麼CoundownLatch/CyclicBarrier提供Future.get()。有用的工具代碼? – cs94njw 2017-08-07 14:36:14