前面的Guarded Suspension Pattern和Balking Pattern都比较极端。一个是“不让?爷不玩了”,另一个是“不行!我一定要玩!”。而,Guarded Timeout Patter就中庸的多了,是“现在不让玩?那我等等吧。如果超过我等待的时间了,我就不玩了”。 还是以代码说话:
class A{
private long timeout; //等待的最长时间
public synchronized void changeState(){
改变状态 通知等待的线程不同再等了(notify/notifyAll)
}
public synchronized void guardedMethod() throws InterruptedException{
long start = System.currentTimeMillis(); //开始时刻
while(条件成立不成立){
long now = System.currentTimeMillis(); //现在时刻
long rest = timeout - (now -start); //还需要等待的时间
if(rest <= 0){throw new InterruptedException("...");} //如果为等待时间为0或者为负数,就不等了。
等着一段时间吧,如果超过我等待的最长时间了,我就不玩了(wait(rest)) //当wait的时间超过rest时,也会抛出InteruptedException。
}
进行处理
}
}
在通常情况下,会对if(rest<=0){...}中抛出的异常进行一下包装,即继承InterruptedException异常,是得调用者知道是超时了(wait(rest),interrupt方法都可能会抛出InterruptedException,所以必须包装一下,让上层程序识别)。
参考: 《Java多线程设计模式》,中国铁道出版社,2005,结城浩
文章来源:
http://localhost/wp2/?p=88