むしろ、プログラムの本体が終わっているに、スレッドがきちんと、startが かかった順番に実行されているのが不思議かも知れません。 これには、実は、理由があります。スレッドには、実行の優先順位が決められている のですが、何も指定しないと、そのスレッドには、デフォールトの実行順位が割り当 てられます。先の3つの例で、3つのスレッドは、同一の順位がつけられていた 訳です。
UNIXのJavaでは、スレッドは、優先順位の高い順に実行されます。順位の低い スレッドは、順位の高いスレッドの実行が完全に終わるまで待たされることに なります。また、同一順位のスレッドは、一つずつ順番に実行されます。 先の例では、同じ順位のスレッドが、順番に実行された訳です。
スレッド実行の優先順位を、「プライオリティ」と呼んでいます。 通常は、1から10までの数字が割り当てられています。デフォールト値は、5です。 それぞれのスレッドに、メソッド setPriority() でプライオリティの設定が 可能です。
次のSample3は、配列priorityの値を使って、各スレッドにプライオリティを設定 するように、先のサンプルに少し、手を入れたものです。 このプログラムの出力を予想して見てください。
class Sample3 extends Thread { static int loop = 3 ; static int priority[] = { 1, 2, 3 }; public void run() { for( int i=1 ; i < 5 ; i++ ) { System.out.println( getName() + ": " + i + "; " ); } } public static void main(String args[]) { for (int i = 0; i < loop ; i++) { Sample3 s = new Sample3(); s.setPriority(priority[i]); s.start(); } } }
このプログラムの出力は、次のようになります。 まずプライオリティの設定ですが、最初のスレッドには1が、次のスレッドには2が、 最後のスレッドには3が設定されることになりますので、最後のスレッドの優先順位が 一番高くなり、結局一番最初に実行されます。最初のスレッドの優先順位は1でしたの で最も低く、最後に実行されることになります。
Thread-6: 1; Thread-6: 2; Thread-6: 3; Thread-6: 4; Thread-5: 1; Thread-5: 2; Thread-5: 3; Thread-5: 4; Thread-4: 1; Thread-4: 2; Thread-4: 3; Thread-4: 4;