0

假设我有一个线程 Thread1 通过在 objectA 上调用 wait() 在等待线程列表中,现在另一个线程在 objectA 上调用 notify() 或 notifyAll(),或在 Thread1 上调用 interrupt(),那么 Thread1 的状态是什么?它是可运行的,还是被阻塞的?

4

2 回答 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 回答