`
xly_971223
  • 浏览: 1280750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程模式之Balking Pattern

 
阅读更多
当现在不适合这个操作,或者没有必要进行这个操作时,就直接放弃而回去
这就是Balking Pattern

主要有4个类
Data 代表要保存的数据
SaverThread 定时存盘线程 模拟word的定时保存
ChangerThread 用户线程 模拟用户在修改文档,文档修改后这两个线程会去抢着保存到文件
Main 就是main啦



直接上代码吧

/**
 * @author 徐良永
 * @date 2013-6-5下午5:02:38
 */
public class Data {

	private String content;
	private boolean changed = false;
	
	public Data(){}
	
	public synchronized void setContent(String content){
		this.content = content;
		this.changed = true;
	}
	
	public synchronized void save(){
		if(!changed){ //没变化 直接返回
			return;
		}
		doSave();
		changed = false;
	}
	
	private void doSave(){
		//TODO write file
		System.out.println(Thread.currentThread().getName() + "call doSave, content = " + content);
	}
	
}


/**
 * 定时存盘线程
 * @author 徐良永
 * @date 2013-6-5下午3:07:44
 */
public class SaverThread extends Thread{

	private Data data;
	
	public SaverThread(Data data){
		super("SaverThread");
		this.data = data;
	}
	
	public void run(){
		try {
			while(true){
				data.save();
				Thread.sleep(2000);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
}



public class ChangerThread extends Thread {
	private Data data;
	private Random random = new Random(); 
	
	public ChangerThread(Data data){
		super("ChangerThread");
		this.data = data;
	}
	public void run(){
		try {
			for (int i = 0; i < 1000; i++) {
				data.setContent("No." + i);
				Thread.sleep(random.nextInt(1000));
				data.save();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

public class Main {

	public static void main(String[] args) {
		Data data = new Data();
		new SaverThread(data).start();
		new ChangerThread(data).start();
		
		
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics