如果我这样做
synchronization (someobject) {
while (someobject.need2wait()) {
someobject.wait(timeout);
}
}
超时到期后会发生什么?如果另一个线程已锁定someobject
,它会被中断吗?
答案 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");
}
}
}