すべてThreads
の s が実行された後に実行する必要があるロギング コードがあります。
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
doLogging()
両方のスレッドが処理を完了した後にのみ実行する方法はありますか? これdoLogging()
は、t1 と t2 が開始されるとすぐに呼び出されます。
すべてThreads
の s が実行された後に実行する必要があるロギング コードがあります。
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
doLogging()
両方のスレッドが処理を完了した後にのみ実行する方法はありますか? これdoLogging()
は、t1 と t2 が開始されるとすぐに呼び出されます。
呼び出しjoin()
前のすべてのスレッドのみdoLogging()
:
t1.join();
t2.join();
// the following line will be executed when both threads are done
doLogging();
join()
すべてのスレッドを待機する場合、呼び出しの順序は重要ではないことに注意してください。
join() ソリューションに加えて、java.util.concurrent ライブラリには CountDownLatch と呼ばれるものもあります。特定の数に初期化してから、指定された回数ヒットするまで待つことができます。
簡単な例:
CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
for(int i=0; i<NUMBER_OF_THREADS;i++)
new Thread(myCode).start();
latch.await();
ただし、これが機能するには、ワーカー スレッドがラッチを明示的にヒットする必要があります。
latch.countDown()