go4it

just do it

模式4-Balking

参考《java多线程设计模式》

当警戒条件不成立就马上中断。

 // 若有资料修改,就存储到挡安里
    public synchronized void save() throws IOException {      
        if (!changed) {                                           
            System.out.println(Thread.currentThread().getName() + " balks");
            return;                                             
        }                                                       
        doSave();                                             
        changed = false;                                          
    }  
// 若有资料修改,就存储到挡安里  删除synchronized方法,并延长时间加大错误出现的机会。
    public  void save() throws IOException {      
        if (!changed) {                                           
            System.out.println(Thread.currentThread().getName() + " balks");
            return;                                             
        }                                                       
        doSave();    
        
        try{
        	Thread.sleep(100);
        }catch(InterruptedException e){
        	
        }
        changed = false;                                          
    }          

结果:有重复写入。

SaverThread calls doSave, content = No.0
ChangerThread balks
SaverThread calls doSave, content = No.1
ChangerThread balks
ChangerThread calls doSave, content = No.2
SaverThread calls doSave, content = No.2
ChangerThread balks
ChangerThread calls doSave, content = No.4
SaverThread calls doSave, content = No.4
ChangerThread balks
ChangerThread calls doSave, content = No.6
SaverThread calls doSave, content = No.7
ChangerThread balks
ChangerThread calls doSave, content = No.8
SaverThread calls doSave, content = No.9
ChangerThread balks
ChangerThread calls doSave, content = No.10
 
设置timeout,如果过了timeout时间,警戒条件没有满足,就抛出异常:
 
private static final long TIMEOUT = 30000;
public synchronized Request getRequest() {      
        long start = System.currentTimeMillis(); // 开始时间
        while (queue.size() <= 0) {                 
            long now = System.currentTimeMillis(); //现在时间
            long rest = TIMEOUT - (now - start); //剩下时间
            if (rest <= 0) {
                throw new LivenessException("thrown by " + Thread.currentThread().getName());
            }
            try {                                   
                wait(rest);
            } catch (InterruptedException e) {      
            }                                       
        }                                           
        return (Request)queue.removeFirst();
    }

posted on 2009-05-07 23:49  cxccbv  阅读(243)  评论(0编辑  收藏  举报

导航