私はJavaでスレッドを勉強しています。
join()
in Threadの使用を説明する簡単な例が欲しいだけです。私はこのリンクを見ました..
しかし、まだ概念を理解できていません。
join()
in Threadを使用する概念を説明してくれる人はいますか。
これに関連する説明は、私にとって非常に役立ちます。
ありがとう。
私はJavaでスレッドを勉強しています。
join()
in Threadの使用を説明する簡単な例が欲しいだけです。私はこのリンクを見ました..
しかし、まだ概念を理解できていません。
join()
in Threadを使用する概念を説明してくれる人はいますか。
これに関連する説明は、私にとって非常に役立ちます。
ありがとう。
私が思いつく最も簡単な説明は、 join が呼び出し元のスレッドを指定されたスレッドの完了を待たせるということです。
「メイン スレッド」と「スレッド A」がある場合、メイン スレッドから A.join() を呼び出すと、メイン スレッドはスレッド A が終了するまで待機します。
同時実行性に関する Java SE のマニュアル ページは、次の場所で役立ちます。http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
Thread.join()
join()
現在のスレッドは、実行を再開する前に、呼び出したスレッドが終了するまで待機します。
Thread.join()は、参加したスレッドが終了するまでブロックします(戻りません)。
これは、スレッドが終了するのを待つ唯一の方法ではありませんが、CPU使用率が最も高い方法です。次のようなループがあった場合を想像してみてください(擬似コード):
while(!thread.isAlive())
{
Sleep(1);
}
これはおそらく同じことをします...しかし、1秒間に1000回、起動し、変数をチェックして、スリープ状態に戻ります。これは、1000個のコンテキストスイッチ(高価)を意味し、その結果、プログラムの速度が低下します。これは「スピンロック」または「ビジーウェイト」と呼ばれ、理由もなくCPUを消費するため、プログラミングでは嫌われます。
いくつかの実験を行った結果は次のとおりです。 1. 最初にスレッド t3 を開始しました。2. t1 を開始し、次に 3. t2 を作成し、t2 を実行中のスレッド t1 に参加させました。定義により、t2 は t1 が終了するのを待ってから開始する必要があります。
観察: t1 で待機を呼び出したので、t1 は一時停止されていますが停止していませんが、なぜ t2 が開始されていることがわかりますか?
public class TestThreadJoin {
public static void main(String[] args) {
final Thread t3 = new Thread(new Runnable() {
public void run() {
System.out.println("R3");
}
});
t3.start();
final Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("R1 before");
try {
perform();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("R1 after");
}
private void perform() throws InterruptedException {
synchronized(this){
wait(5000);
}
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("R2");
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
}
}