Java多线程模式-Balking模式

来源:互联网 发布:淘宝联盟客户端下载 编辑:程序博客网 时间:2024/06/03 23:43

1.场景
自动保存功能:
为防止电脑死机,而定期将数据内容保存到文件中的功能。
2.详细说明
当数据内容被修改时,内容才会被保存。即当写入的内容与上次写入的内容一致时,其实就没有必要执行写入操作。也就是说,以”数据内容是否一致”作为守护条件。若数据内容相同,则不执行写入操作,直接返回。
3.Balking模式的本质:停止并返回
如果现在不合适执行该操作,或者没有必要执行该操作,就停止处理,直接返回—-Balking模式。


要实现上述描述的场景,我们需要设计四个类:数据类Data,修改内容的线程类WriterThread,保存数据的线程类,启动线程的类。类图如下:
这里写图片描述
当数据类Data里的内容被修改时,守护条件”数据内容是否一致”变为false,则进行保存工作:保存工作可由定时保存功能完成也可由修改内容的线程类完成。如果守护条件为true,则直接返回,不执行保存操作。
源代码如下:
数据类

public class Data{    private final String filename;//保存文件的名称    private String content;//数据的内容    private boolean changed;//内容是否已保存的标志,若修改后为保存,则为true    public Data(String filename,String content){        this.filename=filename;        this.content=content;        this.changed=true;    }    //修改数据内容    public synchronized void change(String newContent){        content=newContent;        changed=true;    }    //若数据内容修改过,则保存到文件中    public synchronized void save() throws IOException{        if(!changed){            return;        }        doSave();        changed=false;    }    //将数据保存到文件中    private void doSave() throws IOException {        // TODO Auto-generated method stub        StdOut.println(Thread.currentThread().getName()+" calls doSave,content= "+content);        Writer writer=new FileWriter(filename);        writer.write(content);        writer.close();    }}

修改内容的线程类

public class WriterThread extends Thread {    private final Data data;    private final Random random=new Random();    public WriterThread(String name,Data data){        super(name);        this.data=data;    }    public void run(){        try {            for(int i=0;true;i++){                data.change("NO."+i);//修改数据                Thread.sleep(random.nextInt(1000));//执行其他操作                data.save();            }        } catch (InterruptedException | IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

定时保存数据的线程类

public class SaverThread extends Thread {    private final Data data;    public SaverThread(String name,Data data){        super(name);        this.data=data;    }    public void run(){        try {            while(true){                data.save();//保存数据                Thread.sleep(1000);//休眠约1秒            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

启动线程的类

public class Main {    public static void main(String[] args) {        Data data=new Data("data1.txt", "empty");        new WriterThread("ChangerThead",data).start();        new SaverThread("SaverThread", data).start();    }}

说明:学习《图解java多线程设计模式》的学习笔记整理和自己的理解。

更多技术干货,请关注下面二维码:
这里写图片描述

原创粉丝点击