(六)Balking模式

一、定义

Balking是"退缩不前"的意思。Balking Pattern和Guarded Suspension Pattern一样需要警戒条件。在Balking Pattern中,当警戒条件不成立时,会马上中断,而Guarded Suspension Pattern则是等待到可以执行时再去执行。

 

二、模式案例

该案例会保存数据的属性,之前所保存的属性都会被覆盖。如果当前数据的属性与上次保存的属性并无不同,就不执行保存。

 

//Data定义
public class Data {
    private String filename; //文件名
    private String content; //数据内容
    private boolean changed; //标识数据是否改变

    public Data(String filename, String content) {
        this.filename = filename;
        this.content = content;
        this.changed = true;
    }
    //修改数据
    public synchronized void change(String newContent){
        this.content = newContent;
        changed = true;
    }
    //若数据有修改,则保存,否则直接返回
    public synchronized void save()throws IOException{
        if(!changed){
            System.out.println(Thread.currentThread().getName()+" balks");
            return;
        }
        doSave();
        changed = false;
    }

    private void doSave() throws IOException {
        System.out.println(Thread.currentThread().getName()+" calls doSave,content="+content);
        Writer writer = null;
        try {
            writer = new FileWriter(filename);
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            writer.close();
        }

    }
}
//修改线程模仿"一边修改文章,一遍保存"
public class ChangerThread extends Thread {
    private Data data;
    private Random random = new Random();

    public ChangerThread(Data data,String name) {
        super(name);
        this.data = data;
    }

    @Override
    public void run() {
        for(int i=0;true;i++){
            data.change("No."+i);
            try {
                Thread.sleep(random.nextInt(1000));
                data.save();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//存储线程每隔1s,会对数据进行一次保存,就像文本处理软件的"自动保存"一样
public class SaverThread extends Thread {
    private Data data;

    public SaverThread(Data data,String name) {
        super(name);
        this.data = data;
    }

    @Override
    public void run() {
        while(true){
            try {
                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(data,"ChangerThread").start();
        new SaverThread(data,"SaverThread").start();
    }
}

 

结果分析,ChangerThread是先修改数据,然后休眠之后再进行存储数据;而SaverThread是每隔一秒存储一次数据。所以ChangerThread修改完数据后可能还没来得及保存,数据就被SaverThread保存了,之后ChangerThread想要保存数据时,发现数据已经保存了(没有变化,changed为false),则停止保存行为,打印balks。

 

 

模式讲解

Balking模式的角色如下:

  • GuardedObject(被警戒的对象)参与者

GuardedObject参与者是一个拥有被警戒的方法(guardedMethod)的类。当线程执行guardedMethod时,只有满足警戒条件时,才会继续执行,否则会立即返回。警戒条件的成立与否,会随着GuardedObject参与者的状态而变化。

 

注:上述示例中,Data类就是GuardedObject(被警戒的对象)参与者,save方法是guardedMethod,change方法是stateChangeingMethod。

 

 

借鉴学习自https://segmentfault.com/a/1190000015558615

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值