1

私が行った場合

synchronization (someobject) {  
    while (someobject.need2wait()) {  
      someobject.wait(timeout);  
    }  
}  

タイムアウトが経過するとどうなりますか?別のスレッドがロックsomeobjectされている場合、それは中断されますか?

4

2 に答える 2

1

答えはドキュメントにあります。次のコードで試してみることができます - スレッドが中断されていないことに気付くでしょう:

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");
        }
    }
}
于 2012-12-05T11:40:35.067 に答える
1

オブジェクトの Javadoc を参照してください

スレッド T は、このオブジェクトの待機セットから削除され、スレッド スケジューリングが再度有効になります。次に、オブジェクトを同期する権利を求めて、通常の方法で他のスレッドと競合します。オブジェクトの制御を取得すると、そのオブジェクトに対するすべての同期要求は、現状維持、つまり、wait メソッドが呼び出された時点の状況に復元されます。スレッド T は、wait メソッドの呼び出しから戻ります。したがって、wait メソッドから戻ると、オブジェクトとスレッド T の同期状態は、wait メソッドが呼び出されたときとまったく同じになります。

于 2012-12-05T11:36:11.333 に答える