zoukankan      html  css  js  c++  java
  • Balking Pattern不需要就不用做

    word自动保存功能,如果文档被修改了,后台线程每隔一段时间会自动执行保存功能,但是如果用户在自动保存之前用Ctrl+S手动保存呢?自动保存还会执行吗?答案是不会,因为这个操作时不需要重复做的。

    public class BalkingTest {
    	public static void main(String[] args) {
    		Data data = new Data("data.txt","(empty)");
    		
    		new ChangerThread("ChangerThread", data).start();
    		new AutoSaverThread("AutoSaverThread", data).start();
    	}
    }
    
    class ChangerThread extends Thread{
    	private Data data;
    	private Random random = new Random();
    	
    	public ChangerThread(String name, Data data){
    		super(name);
    		
    		this.data=data;
    	}
    
    	@Override
    	public void run() {
    		try{
    			for(int i=0; true; i++){
    				data.change("No." + i);
    				Thread.sleep(random.nextInt(1000));
    				data.save();
    			}
    		}
    		catch(IOException e){
    			e.printStackTrace();
    		}catch(InterruptedException e){
    			e.printStackTrace();
    		}
    	}
    }
    
    class AutoSaverThread extends Thread{
    	private Data data;
    	public AutoSaverThread(String name, Data data){
    		super(name);
    		
    		this.data=data;
    	}
    	@Override
    	public void run() {
    		try{
    			while(true){
    				data.save();
    				Thread.sleep(3000);
    			}
    		}catch(IOException e){
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    class Data{
    	private final String filename;
    	private String content;
    	private boolean changed;
    	
    	public Data(String filename, String content){
    		this.filename=filename;
    		this.content=content;
    		this.changed = true;
    	}
    	
    	public synchronized void change(String newContent){
    		this.content = newContent;
    		this.changed=true;
    	}
    	
    	public synchronized void save() throws IOException{
    		if(!changed){
    			return;
    		}
    		
    		doSave();
    		changed=false;
    	}
    
    	private void doSave() throws IOException {
    		System.err.println(Thread.currentThread().getName()+" call doSave(), content = "+ content);
    		
    		Writer writer = new FileWriter(filename);
    		writer.write(content);
    		writer.close();
    	}
    }
    

      

    这样就不会重复保存了,执行结果如下:

    AutoSaverThread call doSave(), content = No.0
    ChangerThread call doSave(), content = No.1
    ChangerThread call doSave(), content = No.2
    ChangerThread call doSave(), content = No.3
    ChangerThread call doSave(), content = No.4
    AutoSaverThread call doSave(), content = No.5
    ChangerThread call doSave(), content = No.6
    ChangerThread call doSave(), content = No.7
    ChangerThread call doSave(), content = No.8
    ChangerThread call doSave(), content = No.9
    ChangerThread call doSave(), content = No.10
    AutoSaverThread call doSave(), content = No.11
    ChangerThread call doSave(), content = No.12
    ChangerThread call doSave(), content = No.13
    ChangerThread call doSave(), content = No.14
    ChangerThread call doSave(), content = No.15
    AutoSaverThread call doSave(), content = No.16
    

      还有一种情况,就是一个类的一个方法只想被执行一次,我们可以用Balking 模式处理。

    class RunOnceTime{
    	private boolean initialized = false;
    	public synchronized void init(){
    		if(initialized == true){
    			return;
    		}
    		
    		doInit();
    		
    		initialized = true;
    	}
    	
    	private void doInit(){
    		
    	}
    }
    

      

  • 相关阅读:
    线段树小结
    线段树 区间合并
    线段树
    线段树离散化+区间修改
    线段树模板

    geatpy
    基于Anaconda 安装 geatpy 和 tensorflow
    Python 求“元组、列表、字典、数组和矩阵”的大小
    np.array()和np.mat()区别
  • 原文地址:https://www.cnblogs.com/gaotianle/p/3307729.html
Copyright © 2011-2022 走看看