[英]Waiting for a subset of threads in a Java ThreadPool
比方說,我有一個包含一個線程池X
項目,以及給定的任務采用Y
這些項目(其中Y
遠小於X
)。
我要等待給定任務的所有線程( Y
項目)完成,而不是整個線程池完成。
如果線程池的execute()
方法返回對所用線程的引用,則我可以簡單地將join()
與這些Y
線程的每一個進行join()
,但事實並非如此。
有人知道實現此目標的優雅方法嗎? 謝謝。
而不是execute()
Callable
Runnable
,而只是Callable
invokeAll()
一些Callable
s-然后,您將獲得一個Future
,可以在每個Future
上調用get()
,該方法將阻塞直到任務完成。
您可以使用CyclicBarrier,並讓每個線程僅在類型為Y時等待。
ExecutorService executor = Executors.newFixedThreadPool(X.size);
public void executeAllAndAwaitCompletion(List<? extends Y> myRunnableY){
final CyclicBarrier barrier = new CyclicBarrier(myRunnable.size()+1);
for(final Y y : myRunnableY){
executor.submit(new Runnable(){
public void run(){
y.run();//for the sake of this example y has a run method
barrier.await();
}
});
}
barrier.await();
}
因此,每個運行類型Y的線程都將等待,直到所有這些Y完成。 請注意,您必須在屏障大小上加1以說明最初執行的線程也要等待。
另請注意:如果Michael Borgwardt的示例對您有用,那將是最佳選擇。 但是,如果您需要線程池,則對於每個正在運行Y的線程,不要運行其他任何非Y的線程,那么我的解決方案將是您唯一的方法。 Future.get()將僅阻塞調用線程,並且當線程池完成Y的執行時,它將隨后執行其他一些任務(可能是非Y任務)。
您應使用完全用於此目的的CompletionService
。
Executor
ExecutorCompletionService
使用執行人 CompletionService
提交任務 take
或poll
對下,CompletionService等待任務完成 您可以與其他人共享執行器,只需在頂部創建CompletionService
並將其用於特定任務即可。
創建以Y
為count的CountDownLatch
,並在每個Y
任務中執行latch.countDown()
。 最后, latch.await()
將確保所有Y
任務均已完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.