比方说,我有一个线程池包含X
项目,并且给定的任务使用这些项目的Y
(其中Y
远小于X
)。等待Java线程池中的线程子集
我想等待给定任务的所有线程(Y
项)完成,而不是整个线程池。
如果线程池的方法返回对聘用线程的引用,我可以简单地将join()
分配给这些Y
线程中的每一个线程,但事实并非如此。
有没有人知道一个优雅的方式来实现这一目标?谢谢。
比方说,我有一个线程池包含X
项目,并且给定的任务使用这些项目的Y
(其中Y
远小于X
)。等待Java线程池中的线程子集
我想等待给定任务的所有线程(Y
项)完成,而不是整个线程池。
如果线程池的方法返回对聘用线程的引用,我可以简单地将join()
分配给这些Y
线程中的每一个线程,但事实并非如此。
有没有人知道一个优雅的方式来实现这一目标?谢谢。
而不是荷兰国际集团Runnable
S,只是invokeAll()
一些Callable
秒 - 那么你得到的每个上,您可以拨打get()
,该块,直到任务完成了Future
。
您可以使用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
CompletionService
take
或poll
提交任务等待任务完成ExecutorCompletionService
你提交已完成您可以与其他人共享Executor,只需在顶部创建CompletionService
并将其用于您的特定任务。
创建CountDownLatch
与Y
作为计数,并在Y
任务中做latch.countDown()
。最后latch.await()
将确保所有的Y
任务都完成。
这真的很酷 - 谢谢 - 但所有的任务是相同的类型(他们只属于不同的父母)。 – 2011-01-08 18:37:51