如果我做
synchronization (someobject) {
while (someobject.need2wait()) {
someobject.wait(timeout);
}
}
超时到期时会发生什么?如果另一个线程已锁定someobject
,它会被中断吗?
如果我做
synchronization (someobject) {
while (someobject.need2wait()) {
someobject.wait(timeout);
}
}
超时到期时会发生什么?如果另一个线程已锁定someobject
,它会被中断吗?
请参阅对象的 Javadocs
然后将线程 T 从该对象的等待集中移除,并重新启用线程调度。然后它以通常的方式与其他线程竞争对象同步的权利;一旦它获得了对象的控制权,它对对象的所有同步声明都会恢复到之前的状态——即,恢复到调用等待方法时的状态。线程 T 然后从调用等待方法返回。因此,从等待方法返回时,对象和线程 T 的同步状态与调用等待方法时完全相同。
答案在文档中。您可以使用以下代码自己尝试一下 - 您会注意到没有线程被中断:
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");
}
}
}