以下のコードを参照してください。これは、Oracle のチュートリアル ページから変更されたコード サンプルです。
public class BadThreads {
static String message;
private static class CorrectorThread extends Thread {
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {}
message = "Mares do eat oats.";
System.out.println("1: "+ message);
}
}
public static void main(String args[]) throws InterruptedException {
CorrectorThread c=new CorrectorThread();
c.start();
System.out.println("0: "+ message);
c.run();
System.out.println("2: "+ message);
message = "Mares do not eat oats.";
System.out.println("3: "+ message);
Thread.sleep(2000);
System.out.println("4: "+ message);
}
}
版画
0: null
1: Mares do eat oats.
1: Mares do eat oats.
2: Mares do eat oats.
3: Mares do not eat oats.
4: Mares do not eat oats.
そして大丈夫です。
コメントアウトしたら
c.run();
メインメソッドでは、私は得る
0: null
2: null
3: Mares do not eat oats.
1: Mares do eat oats.
4: Mares do eat oats.
mainがcの前に実行されるのはなぜですか? スレッドcは、その「親」スレッドmainと同じ優先度を持っています。
mainがcに表示されているため、cはmainが戻るのを待っていますか? これは意味がありませんが、私が考えることができる唯一のものです。
//============================
編集:交換
c.run();
と
c.join();
同じ効果とより細かいプログラミングのために。