簡體   English   中英

Executor服務中的從屬線程-Java

[英]Dependent threads in Executor Service - 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完成執行后才應提交? 還是有其他更好的方法來管理此類線程?

PS:也有可能首先提交thread B ,但是它依賴於A因此它將一直等待直到提交thread A並完成執行。

您可以使用CountDownLatch。

假設您有依賴於線程“ B”的線程“ A”。

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

在線程B中傳遞鎖存器對象,並在最后完成方法(由線程B調用的方法)的執行后,可以保留latch.countDown(),它將使鎖存器遞減1。

您還將傳遞給線程A的同一閂鎖對象。 但是,您將把latch.await()保留為第一行,這意味着您的線程A將一直等到閂鎖計數變為0。

因此,線程B完成后,它將對鎖存器進行遞減計數,並使鎖存器計數為0。這將觸發在線程A的下一行,在閂鎖.await()之后。 基本上,它將觸發線程A。

在此處閱讀有關倒數鎖存器: http : //howtodoinjava.com/core-java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/

您也可以使用callable實現相同的目的。 它返回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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM