2016-12-29 21 views
0

我正在處理程序中的多個線程。有一些獨立的線程,一些線程在開始執行之前依賴於其他線程的完成。Executor服務中的依賴線程 - Java

目前,如果它所依賴的仍然是運行的線程,然後等待它的完成我在做這個

for (final String inElementId : inElements) 
{ 
    Thread thread = threadsMap.get(inElementId); 
    if ((thread != null) && thread.interrupted()) 
    { 
     Thread.currentThread().interrupt(); 
     throw new RuntimeException(); 
    } else { 
     thread.join(); 
    } 
} 

因此,每個線程檢查。

我想編寫一個執行程序服務來以系統的方式管理線程。 但我找不到可以檢查依賴項的方法。

如何使用線程池執行程序服務執行此操作,thread B只應提交一次thread A已完成執行?或者還有其他更好的方法來管理這些線程嗎?

P.S:也可能首先提交thread B,但它取決於A,因此它一直等待,直到thread A被提交併且它完成執行。

+0

我認爲是不可能的,而不是檢查線程A這樣做了,檢查其中A是應該做的任務完成與否 – dvsakgec

回答

3

您正在尋找CountDownLatch。

可以說你有線程「A」,依賴於線程「B」。

您需要創建一個CountDownLatch對象,初始化爲值1(如果線程A僅依賴於一個線程)。

在線程B通過閂鎖對象,一旦完成在你可以保持latch.countDown(),則結束方法的執行(通過方法B線程調用)將由1

倒計時閂鎖

您也將傳遞給線程A的同一個閂鎖對象。但是在那裏你會保持latch.await()作爲第一行,這意味着你的線程A將等待,直到鎖存計數變爲0.

因此,當線程B完成時,它將倒計數鎖存器並使鎖存計數爲0.在latch.await()行之後,會觸發線程A中的後續行。基本上,它會觸發線程A

閱讀關於倒計時鎖在這裏:http://howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/

2

您還可以使用可調用的實現同樣的事情。它返回Future實例,並且可以驗證任務是否已完成。

Future future = executorService.submit(new Callable(){ 
public Object call() throws Exception { 
    System.out.println("Asynchronous Callable"); 
    return "Callable Result"; 
}}); 

將這個未來的實例引用添加到線程中作爲依賴關係,在執行之前他們會引用是否將來的任務被執行。

if (future.isDone()){ 
    //do something 
} 

您可以參考這個例子 - http://javahash.com/java-concurrency-future-callable-executor-example/