次のコード セグメントでは、3 つのスレッドを作成し、どれがどれであるかを追跡するためにそれらに番号を付けます。プログラムを実行すると、スレッドがランダムに並べられることを除いて、出力は期待どおりです。それらが作成および開始されたのと同じ順序 (1-2-3) で表示されることを期待していましたが、毎回スクランブルされた結果が得られます。
どうしてこれなの?
PrintTask
オブジェクトはランダムな時間を作成し、スリープsleep
が完了するとメッセージを出力します。コードは単純なので、投稿しません。ExecutorService
別のスレッド オブジェクトの代わりにを使用すると、同じことが起こります。
public static void main(String[] args) {
Thread thread1 = new Thread(new PrintTask("Thread 1"));
Thread thread2 = new Thread(new PrintTask("Thread 2"));
Thread thread3 = new Thread(new PrintTask("Thread 3"));
System.err.println("Starting threads");
thread1.start();
thread2.start();
thread3.start();
System.err.println("Threads started, main ends\n");
}
出力:
スレッド 2 は 4907 の間スリープ状態になります
スレッド 1 は 4779 の間スリープ状態になります
スレッド 3 は 537 の間スリープ状態になります
スレッド 3 スリープ完了
スレッド 1 のスリープが完了しました
スレッド 2 スリープ完了