Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待超时_Java - Fatal编程技术网

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");
        }
    }
}