Java 等待超时
如果我这样做Java 等待超时,java,Java,如果我这样做 超时过期时会发生什么?如果另一个线程锁定了某个对象,它会被中断吗?请参阅Javadocs中的对象 然后从该对象的等待集中删除线程T,并 重新启用线程调度。然后它以通常的方式竞争 与其他线程在对象上进行同步的权限;一旦 已获得对对象的控制,其所有同步声明 对象恢复到原来的状态,即 在调用wait方法时的情况。螺纹T 然后从wait方法的调用返回。因此,作为回报 在wait方法中,对象的同步状态和 线程T与调用wait方法时完全相同 答案在文档中。您可以使用以下代码亲自尝试-您会注意到
超时过期时会发生什么?如果另一个线程锁定了某个对象,它会被中断吗?请参阅Javadocs中的对象 然后从该对象的等待集中删除线程T,并 重新启用线程调度。然后它以通常的方式竞争 与其他线程在对象上进行同步的权限;一旦 已获得对对象的控制,其所有同步声明 对象恢复到原来的状态,即 在调用wait方法时的情况。螺纹T 然后从wait方法的调用返回。因此,作为回报 在wait方法中,对象的同步状态和 线程T与调用wait方法时完全相同
答案在文档中。您可以使用以下代码亲自尝试-您会注意到没有线程被中断:
synchronization (someobject) {
while (someobject.need2wait()) {
someobject.wait(timeout);
}
}
在提问之前,您是否阅读了关于
Object.wait()
的相当全面的文档?如果是这样的话,您能否准确地显示文档中哪些部分看起来不清楚或不完整?当线程等待时,它会释放同步锁。当超时过期时,线程将唤醒,并在可用时重新获取同步锁(即,如果没有线程将其锁定,则立即获取,或者在锁释放后立即获取)。然后,线程将在wait语句之后立即恢复执行。
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");
}
}
}