むしろ、プログラムの本体が終わっているに、スレッドがきちんと、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;