我有許多線程同時運行。在這幾個線程中,執行依賴於其他線程的完成。 對於例如線程完成通知
螺紋 - 1,螺紋 - 2,螺紋 - 3
這些可以獨立運行。
螺紋 - 4,取決於1的完成和2
螺紋 - 5,取決於1的完成和3
螺紋 - 6,取決於在1,2完成和3
所有的線程都被提交給執行者。線程4,5和6必須在啓動之前實現一些等待機制。針對上述情況,Java中可能的阻止機制有哪些?
我有許多線程同時運行。在這幾個線程中,執行依賴於其他線程的完成。 對於例如線程完成通知
螺紋 - 1,螺紋 - 2,螺紋 - 3
這些可以獨立運行。
螺紋 - 4,取決於1的完成和2
螺紋 - 5,取決於1的完成和3
螺紋 - 6,取決於在1,2完成和3
所有的線程都被提交給執行者。線程4,5和6必須在啓動之前實現一些等待機制。針對上述情況,Java中可能的阻止機制有哪些?
你得到一個Future<T>
obejct當您使用
Future<?> ExecutorService.submit(Runnable task)
只是未來傳遞給線程必須等待完成(例如,它的構造函數),做:
future.get();
這將阻止直到這個未來的線程結束。
您可以嘗試使用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()之前(或者使用線程完成任務),可以使用上述方法。
建議使用像CountDownLatch或Future這樣的阻塞工具可以在無限制的執行器上工作,或者至少能夠同時啓動所有6個線程,否則會存在線程匱乏的風險。所以使用Executor與沒有Executor直接啓動所有6個線程相比沒有什麼優勢。
同時,依賴關係決定每個時刻不會有超過3個線程運行。如果線程的實際數量很重要,則應該使用事件驅動的設施而不是阻塞的設施。我的意思是收集信號的對象,當來自任務1和2的信號到達時,提交任務4等。從理論上來看,這類似於Petri nets
。不幸的是,JDK沒有爲事件驅動的任務協調提供標準類。從頭開始實施這樣的信號收集器/任務發射器並不困難,或者您可以使用數據流庫df4j。
「所有線程都被提交給執行者」 - 你的意思是「類型爲Runnable的任務被提交給執行者」嗎? –
是的,這些任務的類型是可運行的 – Abichellam