假设我有一个线程 Thread1 通过在 objectA 上调用 wait() 在等待线程列表中,现在另一个线程在 objectA 上调用 notify() 或 notifyAll(),或在 Thread1 上调用 interrupt(),那么 Thread1 的状态是什么?它是可运行的,还是被阻塞的?
问问题
505 次
2 回答
1
如果一个线程正在等待,那么它就处于一个WAIT
状态。一旦通过调用notify()
或notifyAll()
在线程正在等待的对象上通知线程,线程就会进入BLOCKED
等待获取synchronized
锁的状态。一旦它获得锁,它就可以进入RUNNING
状态。它进入BLOCKED
状态是因为通知线程肯定已经拥有synchronized
锁并且其他线程也可能在同一个锁上被阻塞。
如果它在仍在该wait()
方法中时被中断,则会发生同样的事情。线程必须首先synchronized
通过坐在BLOCKED
队列中来获得锁。一旦它获得锁并进入RUNNING
状态,它就会抛出InterruptedException
.
您可以通过以下测试程序看到这一点:
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);
}
}
于 2013-05-01T01:29:39.637 回答
1
它将是可运行的。另外,如果您的处理器不忙,它可能已经处于运行状态。有关更多示例,请参阅此http://www.javamex.com/tutorials/synchronization_wait_notify.shtml。
于 2013-05-01T01:30:27.060 回答