を使用しExecutorService
てスレッドジョブを実行する場合は、このawaitTermination()
メソッドを使用して、すべてのスレッドがいつ終了したかを知ることができます。
ExecutorService pool = Executors.newFixedThreadPool(10);
pool.submit(yourSolutionsRunnable);
pool.submit(yourSolutionsRunnable);
...
// once you've submitted your last job you can do
pool.shutdown();
次に、送信されたすべてのジョブが完了するのを待つことができます。
pool.waitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
ソリューションを送信した後もスレッドを実行し続ける必要がある場合、これはさらに複雑になります。あなたがあなたの質問を編集して、これをより明白にするならば、私は私の答えを編集します。
編集:
ああ、途中でいくつかの結果を処理したいのですが、すべてのスレッドが完了するまで停止しないでください。
pool.isTerminated()
すべてのジョブが完了したかどうかを通知するテストを使用できます。したがって、ループは次のようになります。
// this is the main thread so waiting for solutions in a while(true) loop is ok
while (true) {
// are all the workers done?
if (pool.isTerminated()) {
// if there are results process one last time
if (!solutions_results.isEmpty()) {
processTheSolutions();
}
break;
} else {
if (solutions_results.isEmpty()) {
// wait a bit to not spin, you could also use a wait/notify here
Thread.sleep(1000);
} else {
processTheSolutions();
}
}
}
編集:
2つのスレッドプールを使用することもできます。1つはソリューションの生成用で、もう1つは処理用です。次に、メインスレッドは、ワーカープールが空になるのを待ってから、ソリューション処理プールを待つことができます。ワーカープールは、ソリューション(存在する場合)をソリューションプールに送信します。必要に応じて、ソリューション処理プールに1つ以上のスレッドを含めることができます。
ExecutorService workerPool = Executors.newFixedThreadPool(10);
final ExecutorService solutionsPool = Executors.newFixedThreadPool(1);
solutionsPool.submit(workerThatPutsSolutionsIntoSolutionsPool);
...
// once you've submitted your last worker you can do
workerPool.shutdown();
workerPool.waitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
// once the workers have finished you shutdown the solutions pool
solutionsPool.shutdown();
// and then wait for it to finish
solutionsPool.waitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);