假设我有一个线程Thread1在objectA上调用wait(),现在是另一个线程调用objectA上的notify()或notifyAll(),或者是Thread1上的interrupt(),Thread1的状态是什么?它可以运行,还是被阻止?
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
它将是可运行的。如果您的处理器不忙,它可能已处于运行状态。 有关更多示例,请参阅此http://www.javamex.com/tutorials/synchronization_wait_notify.shtml。