すべてのスレッドが完了した後にのみ、コードの一部を実行する方法
-
18-09-2019 - |
質問
私はすべての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()
呼び出しの順序は重要ではないことに注意します。
他のヒント
に参加()を溶液に加えた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()
あなたはメインスレッド、それはUIが完全に両方のスレッドまでハングする原因となりますことを心に留めておいてからコードを実行している場合。これは望ましい効果ではないかもしれない。
その代わり、あなたはあなたのLogger
オブジェクト上で、各スレッドが同期の建設を検討し、その構造内での呼び出しを行うことができます。私はあなたが具体的に達成することを試みているかわからないので、他のソリューションは、どのような<のhref = "https://stackoverflow.com/questions/1492069/how-to-execute-a-piece-of-code-です唯一のアフターすべてのスレッド-行われます/ 1492077#1492077" >ヨアヒムのが唯一のスレッド内でそのコードを配置し、提案します。