1

如果我做

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

超时到期时会发生什么?如果另一个线程已锁定someobject,它会被中断吗?

4

2 回答 2

1

请参阅对象的 Javadocs

然后将线程 T 从该对象的等待集中移除,并重新启用线程调度。然后它以通常的方式与其他线程竞争对象同步的权利;一旦它获得了对象的控制权,它对对象的所有同步声明都会恢复到之前的状态——即,恢复到调用等待方法时的状态。线程 T 然后从调用等待方法返回。因此,从等待方法返回时,对象和线程 T 的同步状态与调用等待方法时完全相同。

于 2012-12-05T11:36:11.333 回答
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 回答