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多线程设计模式》的学习笔记整理和自己的理解。
更多技术干货,请关注下面二维码:
阅读全文
0 0
- Java多线程模式-Balking模式
- JAVA多线程模式之Balking
- JAVA多线程模式之Balking
- Balking Patten ------Java 多线程模式(四)
- JAVA多线程模式之Balking 总结!
- Java多线程设计模式-学习笔记-Balking模式.
- java多线程设计模式--Balking不需要就算了
- Java多线程设计模式详解学习笔记六——Balking
- 多线程设计模式之——Balking Pattern
- 设计模式 Concurrency 之 Balking 慢行模式
- java多线程模式:Future模式
- java多线程设计模式
- java多线程设计模式
- java多线程设计模式
- java多线程设计模式
- java多线程设计模式
- java多线程设计模式
- java多线程设计模式
- Mac本地集群上传文件可能出现的问题及解决方法
- 【Unity3d】在Unity3d中使用百度AI人脸识别功能
- 关于service的一些小得
- Spring MVC_HandlerInterceptorAdapter的使用
- SOE记录 软件的维护、修改、扩展功能 口令功能
- Java多线程模式-Balking模式
- yum源配置以及开机自动挂载shell脚本
- 详解ES7的async及webpack配置async
- 各个数据库表名和字段名长度限制
- Python列表转换
- Error communicating with MapOutputTracker-问题解析2
- 字符串算法——String转换为Integer
- php 局部打印
- 重写UIbutto 改变字体和图片位置