[英]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.