Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 调用notify后的线程状态_Java_Multithreading - Fatal编程技术网

Java 调用notify后的线程状态

Java 调用notify后的线程状态,java,multithreading,Java,Multithreading,假设我在objectA上调用wait(),线程Thread1在等待线程列表中,现在在objectA上调用notify()或notifyAll(),或者在Thread1上调用interrupt(),Thread1的状态是什么?它是可运行的还是被阻止的?如果线程正在等待,则它处于WAIT状态。通过调用线程正在等待的对象上的notify()或notifyAll()通知线程后,线程将进入阻塞状态,等待获得同步锁。一旦获得锁,它就可以进入运行状态。它会进入BLOCKED状态,因为通知线程肯定已经有了syn

假设我在objectA上调用wait(),线程Thread1在等待线程列表中,现在在objectA上调用notify()或notifyAll(),或者在Thread1上调用interrupt(),Thread1的状态是什么?它是可运行的还是被阻止的?

如果线程正在等待,则它处于
WAIT
状态。通过调用线程正在等待的对象上的
notify()
notifyAll()
通知线程后,线程将进入
阻塞状态,等待获得
同步
锁。一旦获得锁,它就可以进入运行状态。它会进入
BLOCKED
状态,因为通知线程肯定已经有了
synchronized
锁,其他线程也可能在同一个锁上被阻塞

如果仍在
wait()
方法中时中断,则会发生同样的情况。线程必须首先坐在
阻塞
队列中获得
同步
锁。一旦获得锁并进入
运行
状态,它就会抛出
中断异常

您可以通过以下测试程序看到:

public static void main(String[] args) throws Exception {
    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                synchronized (foo) {
                    foo.wait();
                }
            } catch (InterruptedException e) {
                // this thread won't get here until main thread releases lock
                e.printStackTrace();
            }
        }
    };
    thread.start();
    Thread.sleep(1000);
    synchronized (foo) {
        thread.interrupt();
        Thread.sleep(5000);
    }
}

它将是可运行的。另外,如果处理器不忙,它可能已经处于运行状态。
有关更多示例,请参阅此。

状态与处理器无关。而且它比那更复杂。看我的答案。阿尼基戈德和格雷或多或少都是正确的。线程立即变得可运行,在这种情况下,它试图重新获取对象锁(重新进入同步部分),并可能因此而被阻止。@xagyg听起来很合理,但您从规范或字节码中有任何证据证明这一点吗?阻止的确切原因是什么?具体在哪里?在遇到另一个阻塞操作之前,它是可运行的。这不是一个真正的问题。