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