最初のスレッドが待ち続けるということはなさそう。
適当に開放されるみたい。法則はちゃんとあるけど。
とりあえず試せるソース
public class ThreadTest implements Runnable{
private String name;
private long speed;
ThreadTest(long speed, String name){
this.speed = speed;
this.name = name;
}
public void run() {
try {
Thread.sleep(speed);
System.out.println(name + "トンネル待ち");
synchronized (ThreadTest.class){
System.out.println(name + "トンネル");
Thread.sleep(200);
}
} catch (InterruptedException ex) {
}
}
public static void main(String[] args) {
new Thread(new ThreadTest(100, "特急")).start();
new Thread(new ThreadTest(130, "急行")).start();
new Thread(new ThreadTest(160, "快速")).start();
new Thread(new ThreadTest(200, "普通")).start();
}
}
JDK5の場合は待った順にトンネル。
特急トンネル待ち 特急トンネル 急行トンネル待ち 快速トンネル待ち 普通トンネル待ち 急行トンネル 快速トンネル 普通トンネル
JDK6の場合は後から来た順にトンネル
特急トンネル待ち 特急トンネル 急行トンネル待ち 快速トンネル待ち 普通トンネル待ち 普通トンネル 快速トンネル 急行トンネル
なんだか、細かいところで動きが変わってることが多そうです。
あと、↓のようなこともあるようです。