JAva-joinメソッド

2043 ワード

私たちが話したいのはjoin()です.まず例を見てみましょう.
コード:

public class ThreadTest implements Runnable {
public static int a = 0;

public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}

public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t = new Thread(r);
t.start();
System.out.println(a);
}
}
すみません、プログラムの出力結果は5ですか?答えは:可能です.実は出力5に遭遇するのが難しいときは、通常は5ではありません.もちろんこれも機械と深刻な関係がある.どうしてですか.メインスレッドmainメソッドがSystemを実行すると説明します.out.println(a);この文の場合、スレッドはまだ実行を開始していません.リソースを割り当てて実行の準備をしているのかもしれません.スレッドにリソースを割り当てるのに時間がかかるため、mainメソッドはt.start()メソッドを実行した後、Systemを実行し続ける.out.println(a);,このとき得られた結果はaがまだ変更されていない値0である.出力結果を5にするにはどうすればいいですか?実は簡単ですが、
join()法はこの機能を提供する.
join()メソッドは、メソッドを呼び出すスレッドをその前に実行することができます.
コード:

public class ThreadTest implements Runnable {
public static int a = 0;

public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}

public static void main(String[] args) throws Exception {
Runnable r = new ThreadTest();
Thread t = new Thread(r);
t.start();
t.join();
System.out.println(a);
}
}

このとき,プログラム入力結果は常に5である.
tを使用しないことを証明するために.
join()メソッド、メインスレッドmainメソッドのSystem.out.println(a);文は優先的に実行され、mainメソッドの実行時間を延長するためにmainメソッドにループを追加できます.ループ回数はマシンのパフォーマンスに大きく依存します.サイクル数が適切であれば,aの出力結果も5であることが分かる.
コード:
public class ThreadTest implements Runnable {public static int a = 0;public void run() {for (int k=0; k<5; k++) {a = a + 1;}}public static void main(String[] args) throws Exception {Runnable r = new ThreadTest();Thread t = new Thread(r);t.start();for (int i=0; i<300; i++) {System.out.print(i);}System.out.println();System.out.println(a);}}
このとき、私の機械では、aの出力値は常に5である.
要約すると:1.呼び出したスレッドが実行されてから他のスレッドが実行されることを確認します(もちろん、パラメータを使用してスレッドが実行される時間を規定することもできます).