Balking设计模式
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args){
BalkingTest.test();
}
}
/*
22.2 Balking模式之文档编辑
多个线程监控某个共享变量,A线程监控到共享变量发生变化后即立即触发某个动作,但是
此时发现另外一个线程B已经针对该变量的变化开始了行动,因此A便放弃了准备开始的工作
,我们把这种线程间交互称作Balking(犹豫)设计模式
——简而言之,就是当你去获取临界区资源时,发现正有人在使用着,那么你没有阻塞
而是放弃了去获取这部分的资源。你认定,别的线程已经开始了对这部分资源的
修改操作,所以你无需操作。
*/
class Document{
private boolean changed = false;
private List<String> content = new ArrayList<>();
private final FileWriter writer;
private static AutoSaveThread autoSaveThread;
private Document(String documentPath, String documentName)
throws IOException {
this.writer = new FileWriter(new File(documentPath,documentName),true);
}
public static Document create(String documentPath, String documentName)
throws IOException{
Document document = new Document(documentPath,documentName);
autoSaveThread = new AutoSaveThread(document);
autoSaveThread.start();
return document;
}
public void edit(String content) {
synchronized (this) {
this.content.add(content);
this.changed=true;
}
}
public void close() throws IOException{
autoSaveThread.interrupt();
writer.close();
}
public void save() throws IOException{
synchronized (this) {
if (!changed) {
return;
}
System.out.println(Thread.currentThread()+" execute the save action");
for (String cacheLine : content) {
this.writer.write(cacheLine);
this.writer.write("\r\n");
}
this.writer.flush();
this.changed=false;
this.content.clear();
}
}
}
class AutoSaveThread extends Thread{
private final Document document;
public AutoSaveThread(Document document) {
super("DocumentAutoSaveThread");
this.document = document;
}
@Override
public void run() {
while (true) {
try{
document.save();
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException|IOException e) {
break;
}
}
}
}
class DocumentEditThread extends Thread{
private final String documentPath;
private final String documentName;
private final Scanner scanner = new Scanner(System.in);
public DocumentEditThread(String documentPath, String documentName) {
super("DocumentEditThread");
this.documentPath = documentPath;
this.documentName = documentName;
}
@Override
public void run() {
int times = 0;
try{
Document document = Document.create(documentPath,documentName);
while (true) {
String text = scanner.next();
if("quit".equals(text)){
document.close();
break;
}
document.edit(text);
if (times == 5) {
document.save();
times=0;
}
times++;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class BalkingTest{
public static void test(){
new DocumentEditThread(".","temp.tmp").start();
}
}
Balking设计模式的更多相关文章
- java多线程12设计模式
1.Single Threaded Execution Pattern(单线程运行模式) 2.Immutable Pattern(一成不变的模式) 3.Guarded Suspension Patte ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
随机推荐
- qt mingw64版本编译报错:incorrect register `%rax' used with `l' suffix(movl要改成mov)
环境:WIN10 编译器:mingw64的g++.exe 我的目的是把程序编译成64bit版本的,所以一开始遇到该错误是丈二和尚摸不着头脑,google了一圈也没找到准确的答案.后来从某些回答中大概发 ...
- Android零基础入门第6节:配置优化SDK Manager,正式约会女神
原文:Android零基础入门第6节:配置优化SDK Manager,正式约会女神 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Androi ...
- mysqldump数据库备份与恢复
mysqldump -u 用户名 -p 数据库名> 备份的文件名 本文中因服务器为多实例,所以在执行登陆等命令时指定了-S参数,即指定其中一个数据库 备份: mysqldump -u root ...
- BackgroundWorker 简单使用教程 多个线程的创建
原文:BackgroundWorker 简单使用教程 多个线程的创建 BackgroundWorker是一个非常不错的线程控件,能避免界面假死,让线程操作你想要做的事,它学习起来很简单,但是能实现很强 ...
- 在mac上尝试docker-swarm
声明:本博客欢迎转发,但请保留原作者信息!新浪微博:@Lingxian_kong;博客地址:孔令贤的博客;内容系本人学习.研究和总结,如有雷同,实属荣幸! 安装docker-machine 我的安装环 ...
- Qt之界面数据存储与获取(userData)
http://blog.csdn.net/u011012932/article/details/52413012#comments
- 【操作系统】elementary OS 和 deepin OS
文章摘自:http://blog.sina.com.cn/s/blog_64fb59d90102x3xa.html 部分参考:https://bbs.deepin.org/forum.php?mod= ...
- [转]深入了解iPad上的MouseEvent
iPad上没有鼠标,所以手指在触发触摸事件(TouchEvent)的时候,系统也会产生出模拟的鼠标事件(MouseEvent). 这对于普通网页的浏览需求而言,基本可以做到与PC端浏览器无明 ...
- Keepalived双主模式配置流程
实验说明 1)keepalived 支持配置多个VRRP实例,每个实例对应一个业务 2)本次实验将实现 keepalived 的互为主备: 业务A:keepalived01为Master,keepal ...
- CentOS7.5上FTP服务的安装与使用
1.FTP简介 1.1FTP:File Transfer Protocol 文件传输协议 FTP是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式.它属于网络传输协议的应用层.文件传送(f ...