java中,同步代码(synchronized代码块)中,对象调用wait()放弃锁,使当前进程进入睡眠等待状态,必须由noyify()或者notifyAll()唤醒,而若是等待超时模式(wait(long seconds))下,则分为两种情况:
1、在等待时间内被唤醒,则接着执行下面的代码。
2、未在等待时间内被唤醒,则当前线程也会自动“醒来”,并继续执行下面的代码。
在等待/通知范式下引入超时等待模式,防止“永久”阻塞调用者
代码:
package newcode;
public class WaitNotifyTimeOutDemo {
static Object lock=new Object();
static boolean isWait=true;
public static void main(String[] args) {
Thread waiThread=new Thread(new WaitThread(5000),"waitThread");
waiThread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread notiThread=new Thread(new NotifyThread(),"NotifyThread");
notiThread.start();
// TODO Auto-generated method stub
}
static class WaitThread implements Runnable{
long waitMis;
public WaitThread(long waitMis) {
this.waitMis=waitMis;
}
public void run() {
long futureTime=System.currentTimeMillis()+waitMis;
System.out.println("超时时间为:"+futureTime);
long remaining=this.waitMis;
synchronized(lock) {
while(remaining>0&&isWait) {
try {
System.out.println("lock begin to wait....");
lock.wait(remaining);
} catch (Exception e) {
// TODO: handle exception
}
remaining=futureTime-System.currentTimeMillis();
System.out.println("finish wait ...remaining time:"+System.currentTimeMillis());
}
if(remaining<0) {
System.out.println("超时了,返回吧");
//return;
}
System.out.println("finish ............"+System.currentTimeMillis());
return;
}
}
}
static class NotifyThread implements Runnable{
public void run() {
synchronized (lock) {
isWait=false;
//注意notify和notifyAll都不释放锁,只是唤醒正在等待这个对象的monitor的线程,但其是否能得到monitor取决于cpu调度
lock.notifyAll();
System.out.println("give up obj lock and notify waitobj~~~");
// 为了描述唤醒了等待对象monitor的线程,但是不一定能得到锁
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// System.out.println("notify sleep ends at:"+System.currentTimeMillis());
}
}
}
}