等待超时

时间:2012-12-05 11:31:10

标签: java

如果我这样做

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

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

2 个答案:

答案 0 :(得分:1)

请参阅Javadocs for Object

  

然后从该对象的等待集中删除线程T.   重新启用线程调度。然后它以通常的方式竞争   与其他线程有权在对象上同步;一旦它   已获得对象的所有控制权   该对象恢复到原状 - 即,到   调用wait方法时的情况。线程T.   然后从wait方法的调用返回。因此,返回时   从wait方法,对象的同步状态和   线程T与调用wait方法时完全一样。

答案 1 :(得分: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");
        }
    }
}