У меня есть некоторое количество потребительских потоков, любое из которых также может выступать в качестве производителя. Как я должен знать, когда все они закончили свою работу?Остановить работу, если все потоки простаивают
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);
}
}
...
}
На самом деле я пытаюсь реализовать параллельный обход дерева. –
@ guest-414 Тогда, в зависимости от того, что вы делаете, когда вы пересекаете это дерево, 'ForkJoinPool' может быть именно тем, что вы хотите. Это полезно, когда у вас ситуация с картой/уменьшением, поэтому, если ваш обход создает некоторую итоговую функцию по дереву, рекурсивная fork/join будет обрабатывать все параллелизм для вас. – chrylis