我有一些消费者线程,其中任何一个也可以充当制作人。我怎么知道他们什么时候完成了他们的工作?
class Worker extends Thread{
void process(Task t){
...
if(needsMoreWork(t)){
queue.addAll(extractTasks(t));
}
}
public void run(){
while(isRunning){
Task t = queue.take();//I need to finish somehow.
process(t);
}
}
...
}
答案 0 :(得分:5)
不是手动使用Thread
,而是将您的任务提交给ExecutorService
,并使用CountDownLatch
,CyclicBarrier
或Phaser
进行同步,取决于您是否需要多个工作周期以及每个周期中是否有相同数量的任务组件。
根据process
的具体内容,ForkJoinPool
可能是一个值得考虑的选项;它基本上包含了“对一堆物品执行相同操作并收集结果”的想法。