参考《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();
    }

相关文章:

  • 2021-07-07
  • 2021-09-14
  • 2021-07-19
  • 2021-08-22
  • 2022-01-02
  • 2021-09-09
  • 2021-11-15
  • 2021-09-08
猜你喜欢
  • 2021-11-06
  • 2022-01-22
  • 2021-12-26
  • 2022-12-23
  • 2022-01-31
  • 2021-12-11
  • 2021-09-22
相关资源
相似解决方案