我上课了。很简单,只需打印,睡觉然后打印;
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`
答案 0 :(得分:10)
这个记录很少。 Thread#join(long)
个州的javadoc
当线程终止时,将调用
this.notifyAll
方法。 是的 建议应用程序不使用wait
,notify
或notifyAll
Thread
个实例。
具体说不要做你目前正在做的事情。也就是说,synchronized
对象上的Thread
并在同一个对象上调用wait
。
synchronized (t) {
System.out.println(t.getState());
t.wait();
}
在当前的代码执行中。当您的t.wait()
线程处于休眠状态时,您的主线程会到达上面的TEST
调用。然后TEST
醒来并终止。当它终止时,它会调用notifyAll
从t.wait()
唤醒你的主线程。
当你的主线程到达第二个t.wait()
时,你的程序中没有任何东西可以唤醒它,所以你的程序就会挂起。
所有这一切要说:不要使用Thread
对象监视器来做任何事情。