Balking模式-实例

2024-01-09 23:42:04

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

}

文章来源:https://blog.csdn.net/wcg_jishuo/article/details/135491262
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。