Thread
以下は、同期ブロックに入り、5 秒間待機してから終了するコードです。2 つのThread
インスタンスを同時に開始しました。
スレッドの 1 つが同期されたオブジェクトのロックを所有し、他のスレッドが待機することが予想されます。5 秒後にロック所有者が終了すると、待機中のスレッドが実行されます。
しかし、実際には、両方のスレッドが同期ブロックを同時に実行し、同時に終了します。
期待される出力:
Thread-X <timeX> received the lock.
Thread-X <timeX+5s> exiting...
Thread-Y <timeY> received the lock.
Thread-Y <timeY+5s> exiting...
実際の出力:
Thread-X <time> received the lock.
Thread-Y <time> received the lock.
Thread-X <time+5s> exiting...
Thread-Y <time+5s> exiting...
何か見逃しているのでしょうか?
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test2 {
public static void main(String[] args) {
MyRunnable m = new MyRunnable();
Thread t = new Thread(m);
Thread t1 = new Thread(m);
t.start();
t1.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
synchronized (this) {
try {
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
System.out.println(Thread.currentThread().getName() + " " + formatter.format(date) + " received the lock.");
wait(5000);
date = new Date(System.currentTimeMillis());
System.out.println(Thread.currentThread().getName() + " " + formatter.format(date) + " exiting...");
} catch(InterruptedException ie) {}
}
}
}
ベストアンサー1
答えはjava.lang.Object.wait(long)その文書には次のように記されている:
[...] このメソッドは、現在のスレッド(Tと呼ぶ)をこのオブジェクトの待機セットに配置し、その後このオブジェクトに対するすべての同期要求を放棄する. [...]