私が行った場合
synchronization (someobject) {
while (someobject.need2wait()) {
someobject.wait(timeout);
}
}
タイムアウトが経過するとどうなりますか?別のスレッドがロックsomeobject
されている場合、それは中断されますか?
私が行った場合
synchronization (someobject) {
while (someobject.need2wait()) {
someobject.wait(timeout);
}
}
タイムアウトが経過するとどうなりますか?別のスレッドがロックsomeobject
されている場合、それは中断されますか?
答えはドキュメントにあります。次のコードで試してみることができます - スレッドが中断されていないことに気付くでしょう:
public class TestWait {
private static volatile boolean ready = false;
public static void main(String[] args) throws Exception {
final Object lock = new Object();
Runnable waitingTask = new Runnable() {
@Override
public void run() {
synchronized(lock) {
while(!ready) {
try {
System.out.println("Going to wait here");
lock.wait(1000);
} catch (InterruptedException ex) {
System.out.println("Thread interrupted");
}
}
System.out.println("I'm done waiting");
}
}
};
new Thread(waitingTask).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("main interrupted");
}
ready = true;
System.out.println("ready");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("main interrupted");
}
}
}
オブジェクトの Javadoc を参照してください
スレッド T は、このオブジェクトの待機セットから削除され、スレッド スケジューリングが再度有効になります。次に、オブジェクトを同期する権利を求めて、通常の方法で他のスレッドと競合します。オブジェクトの制御を取得すると、そのオブジェクトに対するすべての同期要求は、現状維持、つまり、wait メソッドが呼び出された時点の状況に復元されます。スレッド T は、wait メソッドの呼び出しから戻ります。したがって、wait メソッドから戻ると、オブジェクトとスレッド T の同期状態は、wait メソッドが呼び出されたときとまったく同じになります。