Java 如果所有线程都空闲,则停止工作
我有一些消费线程,其中任何一个也可以作为生产者。我怎么知道他们什么时候都完成了工作Java 如果所有线程都空闲,则停止工作,java,multithreading,Java,Multithreading,我有一些消费线程,其中任何一个也可以作为生产者。我怎么知道他们什么时候都完成了工作 class Worker extends Thread{ void process(Task t){ ... if(needsMoreWork(t)){ queue.addAll(extractTasks(t)); } } public void run(){ while(isRunning){
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);
}
}
...
}
与其手动使用
线程
s,不如将任务提交给执行器服务
,并使用倒计时锁存器
、周期载波器
、或相位器
,这取决于您是否需要多个作业周期以及每个周期中的任务组件数量是否相同
取决于您的<代码>进程<代码>所包含的内容,一个<代码> FokCouthPo水池< /Cord>可能是一个可以考虑的选项;它基本上总结了“对一组项目执行相同的操作并收集结果”的思想。
与其手动使用线程,不如将任务提交给执行器服务
,并使用倒计时锁存器
、循环载波器
或相位器
来同步它们,取决于您是否需要多个工作周期,以及每个周期中的任务组件数量是否相同
取决于您的<代码>进程<代码>所包含的内容,一个<代码> FokCouthPo水池< /Cord>可能是一个可以考虑的选项;它基本上总结了“对一堆项目执行相同的操作并收集结果”的思想。
实际上我正在尝试实现并行树遍历。@guest-414那么根据遍历树时所做的操作,ForkJoinPool
可能正是您想要的。当您遇到map/reduce情况时,它会很有帮助,因此,如果您的遍历在树上产生一些摘要函数,则递归fork/join将为您处理所有并发。实际上,我正在尝试实现并行树遍历。@guest-414然后,这取决于您在遍历该树时所做的操作,ForkJoinPool
可能正是您想要的。当您遇到map/reduce情况时,它很有帮助,因此如果您的遍历在树上生成了一些摘要函数,那么递归fork/join将为您处理所有并发。