Java 调用notify后的线程状态
假设我在objectA上调用wait(),线程Thread1在等待线程列表中,现在在objectA上调用notify()或notifyAll(),或者在Thread1上调用interrupt(),Thread1的状态是什么?它是可运行的还是被阻止的?如果线程正在等待,则它处于Java 调用notify后的线程状态,java,multithreading,Java,Multithreading,假设我在objectA上调用wait(),线程Thread1在等待线程列表中,现在在objectA上调用notify()或notifyAll(),或者在Thread1上调用interrupt(),Thread1的状态是什么?它是可运行的还是被阻止的?如果线程正在等待,则它处于WAIT状态。通过调用线程正在等待的对象上的notify()或notifyAll()通知线程后,线程将进入阻塞状态,等待获得同步锁。一旦获得锁,它就可以进入运行状态。它会进入BLOCKED状态,因为通知线程肯定已经有了syn
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听起来很合理,但您从规范或字节码中有任何证据证明这一点吗?阻止的确切原因是什么?具体在哪里?在遇到另一个阻塞操作之前,它是可运行的。这不是一个真正的问题。