繁体   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