Balking模式
所谓Balk就是停止并返回的意思。
如果守护条件不成立,则立即中断处理。
因为Guarded Suspension模式是一直等待至可以运行。
当写入的内容与上次写入的内容完全相同时,
再向文件写入就显得多余了,
所以就不再执行写入操作。
也就是说,该程序以"数据内容存在不同"作为守护条件,
如果数据内容相同,则不执行写入操作,直接返回balk.
在此我们来思考以下文本工具的"自动保存功能"。
所谓自动保存功能,就是为了防止电脑突然死机,
而定期地将数据保存到文件中的功能。
Data 表示可以修改并保存的数据的类
SaveThread 定期保存数据内容的类
ChangerThread 修改并保存数据内容的类
Main 测试程序行为的类
当看到synchronized时,就应该思考一下,这个synchronized
在保护着什么?
public class ChangerThread extends Thread{private final Data data;private final Random random = new Random();public ChangerThread(String name,Data data){super(name);this.data = data;}public void run(){try{for(int i=0;true;i++){data.changed("No."+i);Thread.sleep(random.nextInt(1000));data.save();}} catch (InterruptedException e){e.printStackTrace();} catch (IOException e){e.printStackTrace();}}
}
public 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 = changed;}public synchronized void changed(String newContent){content = newContent;changed = true;}public synchronized void save() throws IOException{if(!changed){return;}doSave();changed = false;}private void doSave() throws IOException{System.out.println(Thread.currentThread().getName() +"calls doSave,content=" +content);Writer writer = new FileWriter(filename);writer.write(content);writer.close();}
}
public class SaveThread extends Thread{private final 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 e){e.printStackTrace();}catch (InterruptedException e){e.printStackTrace();}}
}
public class Main{public static void main(String[] args) {Data data = new Data("data.txt","(empty)");new ChangerThread("ChangerThread",data).start();new SaveThread("saveThread",data).start();}}