簡體   English   中英

等待Java ThreadPool中的線程子集

[英]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提交任務
  • 使用takepoll對下,CompletionService等待任務完成
  • 重復直到您提交的所有任務完成
  • 完成

您可以與其他人共享執行器,只需在頂部創建CompletionService並將其用於特定任務即可。

創建以Y為count的CountDownLatch ,並在每個Y任務中執行latch.countDown() 最后, latch.await()將確保所有Y任務均已完成。

暫無
暫無

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

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