2013-11-26 44 views
1

我有許多線程同時運行。在這幾個線程中,執行依賴於其他線程的完成。 對於例如線程完成通知

螺紋 - 1,螺紋 - 2,螺紋 - 3

這些可以獨立運行。

螺紋 - 4,取決於1的完成和2

螺紋 - 5,取決於1的完成和3

螺紋 - 6,取決於在1,2完成和3

所有的線程都被提交給執行者。線程4,5和6必須在啓動之前實現一些等待機制。針對上述情況,Java中可能的阻止機制有哪些?

+0

「所有線程都被提交給執行者」 - 你的意思是「類型爲Runnable的任務被提交給執行者」嗎? –

+0

是的,這些任務的類型是可運行的 – Abichellam

回答

3

你得到一個Future<T> obejct當您使用

Future<?> ExecutorService.submit(Runnable task) 

只是未來傳遞給線程必須等待完成(例如,它的構造函數),做:

future.get(); 

這將阻止直到這個未來的線程結束。

1

您可以嘗試使用ExecutorService的執行線程上完成的工作,你可以嘗試調用CountDownLatch類的await()方法如下(您想使用線程完成的任務),其中:

public void finishWork() { 
     try { 
      System.out.println("START WAITING for thread"); 
      countDownLatch.await(); 
      System.out.println("DONE WAITING for thread"); 
     } catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

而且要監視每個線程,您可以嘗試調用此類中可用的countDown()方法。因此,在ExecutorService上調用shutdown()之前(或者使用線程完成任務),可以使用上述方法。

2

建議使用像CountDownLatch或Future這樣的阻塞工具可以在無限制的執行器上工作,或者至少能夠同時啓動所有6個線程,否則會存在線程匱乏的風險。所以使用Executor與沒有Executor直接啓動所有6個線程相比沒有什麼優勢。

同時,依賴關係決定每個時刻不會有超過3個線程運行。如果線程的實際數量很重要,則應該使用事件驅動的設施而不是阻塞的設施。我的意思是收集信號的對象,當來自任務1和2的信號到達時,提交任務4等。從理論上來看,這類似於Petri nets。不幸的是,JDK沒有爲事件驅動的任務協調提供標準類。從頭開始實施這樣的信號收集器/任務發射器並不困難,或者您可以使用數據流庫df4j