importjava.util.concurrent.TimeUnit;public class TestNotify extendsThread{public static voidmain(String[] args) {final Object synObj = newObject();
Thread t1= new Thread(newRunnable() {
@Overridepublic voidrun() {synchronized(synObj) {
System.out.println("1.T1获取synObj的对象监视器,开始执行同步块");try{
TimeUnit.SECONDS.sleep(2);//休息一分钟,不放弃锁
System.out.println("T1在 wait()时挂起了");
synObj.wait();
System.out.println("T1被其他线程唤醒后并重新获得synObj的对象监视器,继续执行");
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("T1获取synObj的对象监视器,结束同步块");
}
};
});
t1.start();
Thread t2= new Thread(newRunnable() {
@Overridepublic voidrun() {
System.out.println("T2启动,但是因为有别的线程占用了synObj的对象监视器,则等待别的线程执行synObj.wait来释放它");synchronized(synObj) {try{
System.out.println("T2获取synObj的对象监视器,进入同步块");
synObj.notify();
System.out.println("T2执行synObj.notify()");
TimeUnit.SECONDS.sleep(2);
System.out.println("T2结束同步块,释放synObj的对象监视器");
}catch(InterruptedException e) {
e.printStackTrace();
}
}
};
});
t2.start();
Thread t3= new Thread(newRunnable() {
@Overridepublic voidrun() {
System.out.println("T3启动,但是因为有别的线程占用了synObj的对象监视器,则等待别的线程执行synObj.wait来释放它");synchronized(synObj) {try{
System.out.println("T3获取synObj的对象监视器,进入同步块");
synObj.notify();
System.out.println("T3执行synObj.notify()");
TimeUnit.SECONDS.sleep(2);
System.out.println("T3结束同步块,释放synObj的对象监视器");
}catch(InterruptedException e) {
e.printStackTrace();
}
}
};
});
t3.start();
}
}