当线程处于可运行状态时,为什么对象不锁定?

时间:2016-04-09 18:23:23

标签: java multithreading

我上课了。很简单,只需打印,睡觉然后打印;

    public class Run implements Runnable {

    @Override
    public void run() {
        System.out.println("START RUN");
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("FINISH RUN");
    }
}

好的,我现在正在写测试;

public static synchronized void main(String[] args) throws InterruptedException {

        Run r = new Run();
        Thread t = new Thread(r, "TEST");
        t.start();

        // EXECYTE THE CODE WHULE THREAD "TEST" IS RUNNABLE 
        synchronized (t) {
            System.out.println(t.getState());
            t.wait();
        }
        System.out.println("Y");

        // SLEEP THREAD "TEST" TO BE EXECUTED DURING THE TIME
        Thread.sleep(100);
        synchronized (t) {
            System.out.println(t.getState());
            t.wait();
        }
        System.out.println("Y2");
    }

问题1:虽然线程" TEST"正在执行我尝试wait()。 此时线程状态为" RUNNABLE "。由于这种状态,等待,我不明白为什么?如果状态为" TERMINATED"或"新" wait()有效;如果我删除t.start(),线程状态将为" NEW"等等也有效。你能告诉我发生了什么吗?

输出:

START RUN
RUNNABLE
FINISH RUN
Y
TERMINATED`

1 个答案:

答案 0 :(得分:10)

这个记录很少。 Thread#join(long)个州的javadoc

  

当线程终止时,将调用this.notifyAll方法。 是的   建议应用程序不使用waitnotifynotifyAll   Thread个实例。

具体说不要做你目前正在做的事情。也就是说,synchronized对象上的Thread并在同一个对象上调用wait

synchronized (t) {
    System.out.println(t.getState());
    t.wait();
}

在当前的代码执行中。当您的t.wait()线程处于休眠状态时,您的主线程会到达上面的TEST调用。然后TEST醒来并终止。当它终止时,它会调用notifyAllt.wait()唤醒你的主线程。

当你的主线程到达第二个t.wait()时,你的程序中没有任何东西可以唤醒它,所以你的程序就会挂起。

所有这一切要说:不要使用Thread对象监视器来做任何事情