balking

                                                                                balking

    其实我们发现多线程中balking pattern 和   Guarded Suspension pattern 很相像,但是其实是里面不同,对于  Guarded Suspension pattern模式中 可能会有多个线程都去获取资源,通过保护区,资源不够的时候就不执行当前线程使线程等待,等资源够了就可以使用等待的线程了。所以  Guarded Suspension pattern 的线程每个都是希望执行方法的,而balking中只希望有一个线程执行了就可以了,并不希望有多个线程执行。(考虑好这个问题,不够线程优先级特定的情况下会有问题,需要仔细考虑,现在考虑的是公平锁情况下)   

    public class SaveThread  extends Thread{
	private Data data;
	
	public SaveThread(String name,Data data) {
		super(name);
		this.data=data;
	}
	
	public void run(){
		try{
			while(true){
				data.save();
				Thread.sleep(1000);
			}
		}catch(IOException |InterruptedException a){
		}
	}
    }
    //指定修改 
    public class ChangeThread extends Thread {
	private Data data;
	public ChangeThread(String name,Data data) {
		super(name);
		this.data=data;
	}
	
	public void run(){
		try{
			for(int i=0;;i++){
				data.change("no."+i);
				Thread.sleep(300);
				data.save();
			}
		}catch(IOException| InterruptedException e){
		}
	}
    }
    
    public class Data {
	private final String fileName;
	private boolean changed;
	private String content;

	public Data(String filename, String content) {
		this.fileName = filename;
		this.content = content;
	}

	public synchronized void change(String newContent) {
		content = newContent;
		changed = true;
	}

	public synchronized void save() throws IOException {
		if (!changed) {
			return;
		}
		doSave();
		changed = false;
	}

	public void doSave() throws IOException {
		System.out.println(Thread.currentThread().getName()
				+ " calls doSave, content = " + content);
		Writer writer = new FileWriter(fileName,true);
		writer.write(content);
		writer.close();
	}

    }
    
    public class Main {
	public static void main(String args[]){
		Data data=new Data("data.txt","empty");
		new ChangeThread("change", data).start();
		new SaveThread("save", data).start();
		
	}
    }

    打印的结果是:                           no.0no.1no.2no.3no.4no.5no.6no.7no.8no.9no.10no.11no.12no.13no.14no.15no.16no.17no.18no.19no.20no.21no.22no.23

    线程之间有竞争,又只希望其中一个获胜 balking pattern 就可以安心使用了。

你可能感兴趣的:(balking)