前面的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