调用notify后的线程状态

时间:2013-05-01 01:24:04

标签: java multithreading

假设我有一个线程Thread1在objectA上调用wait(),现在是另一个线程调用objectA上的notify()或notifyAll(),或者是Thread1上的interrupt(),Thread1的状态是什么?它可以运行,还是被阻止?

2 个答案:

答案 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