作成した2つのスレッドが実行メソッドを終了した後にのみ配列を印刷したい。どうすればそれができますか?
6 に答える
単純。Thread.join()を使用します。スレッドを生成している間に、それらをリストに追加し、そのリストをループして、thread.join()を呼び出します。そのループから抜けると、すべてのスレッドが終了したことが確認されます。その後、printステートメントを作成できます。
このようなもの:
import java.lang.*;
public class ThreadDemo implements Runnable {
public void run() {
//some implementation here
}
public static void main(String args[]) throws Exception {
List<Thread> threadList = new ArrayList<Thread>();
Thread t1 = new Thread(new ThreadDemo());
t1.start();
threadList.add(t1);
Thread t2 = new Thread(new ThreadDemo());
t2.start();
threadList.add(t2);
for(Thread t : threadList) {
// waits for this thread to die
t.join();
}
System.out.print("All the threads are completed by now");
}
}
メソッドを見てくださいThread#join()
。例えば:
Thread a = ...;
a.start();
a.join(); // wait until Thread a finishes
何か試しましたか?
スレッドが終了するまでコードを待機させる標準的な方法は、そのスレッドで join() メソッドを呼び出すことです。それが戻ると、スレッドは完了です。それを調べてみて、あなたが理解できるものを見つけてください。
この投稿を見てください(一連のスレッドが完了するのを待つ方法は?、いくつかのスレッドが完了するのを待つ方法は?)。
私の意見では、CountDownLatchを使用する必要があります。
印刷する前に、これを表示する必要があります。
CountDownLatch startSignal = new CountDownLatch(2);
// Create your threads and add startSignal as parameters to them
各スレッドの終わりに、次のように呼び出します。
startSignal.countDown();
その後、印刷する前に、次の電話番号を呼び出す必要があります。
startSignal.await();
// print...
これは、カウンタがゼロに達した後も継続します。
これらのジョブを Executor に送信すると、それぞれがオブジェクトを返しFuture
ます。これらの先物のそれぞれで get() メソッドを呼び出すと、すべてが完了するまでブロックされます。
String[] myArr = new String[0];
ExecutorService service = Executors.newSingleThreadExecutor();
//Just one task, but repeat with as many as needed.
Future f = service.submit(new Runnable() {
public void run() {
//Executing code
}
});
f.get();
System.out.println(Arrays.toString(myArr)); //Print array.
Thread.join()
は、特定のスレッドが完了するまで待機するより標準的な方法ですが、個人的には、この日と年齢でこのアプローチを好みます。これにより、単一のスレッド化されたエグゼキューターを並行スレッド プール (または同様の) に交換することがはるかに簡単になります。必要が生じ、個人的にはそれがよりきちんとしていると思います。また、同時実行計算の結果を直接取得できる をCallable
提供して、 sと連携するように簡単にリファクタリングすることもできます。Future
どちらのアプローチも機能しますが、どちらが適しているかは、ユース ケースによって異なります。