私はこの単純なスキーマを持っています:
int parallelism = 4; //4 tasks
ExecutorService executor = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(parallelism);
for(int i=0;i<parallelism;i++){
executor.execute(new MyTask());
}
latch.await();
System.out.println("done");
タスクが呼び出す場所
public void run(){
System.out.println("working");
latch.countDown();
}
実行は私に与えますが:
working
working
working
working
done
プログラム全体が実行され続けます!どうして?
をシャットダウンする必要がありますExecutor
。
ExecutorService executor = Executors.newCachedThreadPool();
// ...
executor.shutdown();
while ( executor.awaitTermination(1, TimeUnit.SECONDS)) {
System.out.println("This is taking too long.");
}
すべてのランナブルが完了していExecutor
ても、スレッドはプールに保持されます。これらはあなたの出口を妨げているものです。main
すべての非デーモンスレッドが完了するまで、スレッドが終了しません。
別の方法として、JavaでExecutorServiceをデーモンに変換Executor
する(デーモンスレッドを使用する)も参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加