什么是线程休息室:1.当调用wait()方法时,会有一个waitset的概念,当调用一个对象的wait()方法后,就会将该线程放入到该对象的wait set中,这个wait set是一个虚的概念,并不是真实存在的,靠JVM实现,各个JVM 的实现是不相同的。
2.线程从wait set中唤醒的顺序不是FIFO。
3.当线程被block后,再次被唤醒时需要重新获取锁,但是会从上一次执行的地方继续往下执行,而不是再次执行整个线程体。
`public class WaitSet {
private static final Object LOCK=new Object();
private static void work(){
synchronized (LOCK){
System.out.println("Begining...");
try {
System.out.println("Come in");
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Out..");
}
}
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
work();
}
}.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (LOCK){
LOCK.notify();//注意调用notify()和wait时必须先加锁,拿到监视器对象才能有效
}
}
`
执行结果:
Begining...
Come in
Out..