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