Balking Pattern不需要就不用做
word自动保存功能,如果文档被修改了,后台线程每隔一段时间会自动执行保存功能,但是如果用户在自动保存之前用Ctrl+S手动保存呢?自动保存还会执行吗?答案是不会,因为这个操作时不需要重复做的。
public class BalkingTest {
public static void main(String[] args) {
Data data = new Data("data.txt","(empty)");
new ChangerThread("ChangerThread", data).start();
new AutoSaverThread("AutoSaverThread", data).start();
}
}
class ChangerThread extends Thread{
private Data data;
private Random random = new Random();
public ChangerThread(String name, Data data){
super(name);
this.data=data;
}
@Override
public void run() {
try{
for(int i=0; true; i++){
data.change("No." + i);
Thread.sleep(random.nextInt(1000));
data.save();
}
}
catch(IOException e){
e.printStackTrace();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
class AutoSaverThread extends Thread{
private Data data;
public AutoSaverThread(String name, Data data){
super(name);
this.data=data;
}
@Override
public void run() {
try{
while(true){
data.save();
Thread.sleep(3000);
}
}catch(IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
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 = true;
}
public synchronized void change(String newContent){
this.content = newContent;
this.changed=true;
}
public synchronized void save() throws IOException{
if(!changed){
return;
}
doSave();
changed=false;
}
private void doSave() throws IOException {
System.err.println(Thread.currentThread().getName()+" call doSave(), content = "+ content);
Writer writer = new FileWriter(filename);
writer.write(content);
writer.close();
}
}
这样就不会重复保存了,执行结果如下:
AutoSaverThread call doSave(), content = No.0
ChangerThread call doSave(), content = No.1
ChangerThread call doSave(), content = No.2
ChangerThread call doSave(), content = No.3
ChangerThread call doSave(), content = No.4
AutoSaverThread call doSave(), content = No.5
ChangerThread call doSave(), content = No.6
ChangerThread call doSave(), content = No.7
ChangerThread call doSave(), content = No.8
ChangerThread call doSave(), content = No.9
ChangerThread call doSave(), content = No.10
AutoSaverThread call doSave(), content = No.11
ChangerThread call doSave(), content = No.12
ChangerThread call doSave(), content = No.13
ChangerThread call doSave(), content = No.14
ChangerThread call doSave(), content = No.15
AutoSaverThread call doSave(), content = No.16
还有一种情况,就是一个类的一个方法只想被执行一次,我们可以用Balking 模式处理。
class RunOnceTime{
private boolean initialized = false;
public synchronized void init(){
if(initialized == true){
return;
}
doInit();
initialized = true;
}
private void doInit(){
}
}
Balking Pattern不需要就不用做的更多相关文章
- 制作系统U盘,不用做任何动作直接从U盘启动装系统(非PE的)
用U盘装系统可以用PE方式,进入PE系统,选择镜像文件,然后装,这种比较麻烦. 下面介绍一下从U盘启动,直接装系统的方法,这种方法从U盘启动后,不用做任何动作,就像用光盘装系统一样简单 首先要制作一下 ...
- 从 DevOps 到 Serverless:通过“不用做”的方式解决“如何更高效做”的问题
作者 | 徐进茂(罗离) JAVA 开发工程师 导读:近年来,Serverless 一词越来越热,它已经逐渐成为了一种新型的软件设计架构.和 DevOps 概念提倡的是通过一系列工具和自动化的技术来 ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- iis7.5做反向代理配置方法实例图文教程
网络上好多开场的文章就说了好多的原理之类的这里我们直接开始配置.不过也要简单说下win下配置反向代理只有IIS7以上的版本才可以实现这个功能,在这里我们使用WINDOWS2008 R2来做为测试 20 ...
- Jmeter做压力测试的心得
什么是性能压测? 也是最近刚刚接触到,就是被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定,通常情况,是模拟多个请求同时 请求服务器,也就是在某个时间内,比如说1秒内,调用接口 ...
- 设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)
定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往 ...
- 多线程程序设计学习(5)balking模式和timed模式
Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...
- php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员
本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...
- BAT线下战争:巨额投资或培养出自己最大对手(包括美团、58、饿了么在内的公司都在计划推出自己的支付工具和金融产品,腾讯只做2不做O)
BAT线下战争:巨额投资或培养出自己最大对手 2015年10月12日09:49 <财经>杂志 我有话说(18人参与) 收藏本文 BAT大举投资线下公司,看似咄咄逼人 ...
随机推荐
- jQuery 事件委派
/******************************************************************/ $(function(){ //live()事件委派,后续添加 ...
- 13、testng.xml对用例进行分组
目录如下: TestGroup.java 代码如下: package com.testng.cn; import org.testng.annotations.*; import static org ...
- Xen的半虚拟化(Paravirtualization)
三个特权级 IA-32体系提供了4个特权级别,正常情况下只用了2个, 操作系统运行在Ring 0,而应用程序运行在Ring 3. Xen让自己运行在Ring 0, 而操作系统运行在Ring 1, 应用 ...
- 前端(八)—— 高级布局:文档流、浮动布局、流式布局、定位布局、flex布局、响应布局
高级布局:文档流.浮动布局.流式布局.定位布局.flex布局.响应布局 一.文档流 1.什么是文档流 将窗体自上而下分成一行一行,块级元素从上至下.行内元素在每行中从左至右的顺序依次排放元素 2.本质 ...
- docker容器的常见操作
进入容器 docker exec -it 12a022ee8127 /bin/bash 交互模式进入容器 docker exec -it 12a022ee8127 ip a 查看容器的ip等信息 批量 ...
- [已解决]报错JSONDecodeError
报错: 解决:
- pytest_fixture--scope="session"
import pytest@pytest.fixture(scope="session")def login(): print("\n输入用户名密码登陆! configt ...
- JavaScript小实例-文本循环变色效果
在现实生活中我们常常看到文字循环变色的效果,此效果不仅能让人们印象深刻,还提高了美观度,代码及注释如下: <!DOCTYPE html> <html> <head> ...
- 安装Hama的基本过程
- webapi 找到了与请求匹配的多个操作(ajax报500,4的错误)
1.ajax报500,4的错误,然而多次验证自己的后台方法没错.然后跟踪到如下图的错误信息! 2.因为两个函数都是无参的,返回值也一样.如下图 3,我给第一个函数加了一个参数后,就不报错了,所以我想, ...