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不需要就不用做的更多相关文章

  1. 制作系统U盘,不用做任何动作直接从U盘启动装系统(非PE的)

    用U盘装系统可以用PE方式,进入PE系统,选择镜像文件,然后装,这种比较麻烦. 下面介绍一下从U盘启动,直接装系统的方法,这种方法从U盘启动后,不用做任何动作,就像用光盘装系统一样简单 首先要制作一下 ...

  2. 从 DevOps 到 Serverless:通过“不用做”的方式解决“如何更高效做”的问题

    作者 | 徐进茂(罗离) JAVA 开发工程师  导读:近年来,Serverless 一词越来越热,它已经逐渐成为了一种新型的软件设计架构.和 DevOps 概念提倡的是通过一系列工具和自动化的技术来 ...

  3. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  4. iis7.5做反向代理配置方法实例图文教程

    网络上好多开场的文章就说了好多的原理之类的这里我们直接开始配置.不过也要简单说下win下配置反向代理只有IIS7以上的版本才可以实现这个功能,在这里我们使用WINDOWS2008 R2来做为测试 20 ...

  5. Jmeter做压力测试的心得

    什么是性能压测? 也是最近刚刚接触到,就是被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定,通常情况,是模拟多个请求同时 请求服务器,也就是在某个时间内,比如说1秒内,调用接口 ...

  6. 设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

    定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往 ...

  7. 多线程程序设计学习(5)balking模式和timed模式

    Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...

  8. php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...

  9. BAT线下战争:巨额投资或培养出自己最大对手(包括美团、58、饿了么在内的公司都在计划推出自己的支付工具和金融产品,腾讯只做2不做O)

    BAT线下战争:巨额投资或培养出自己最大对手 2015年10月12日09:49   <财经>杂志    我有话说(18人参与) 收藏本文        BAT大举投资线下公司,看似咄咄逼人 ...

随机推荐

  1. java发带图片正文和附件的邮件mail

    package com.mail; import java.io.UnsupportedEncodingException; import java.util.Date; import java.ut ...

  2. SPSS聚类分析:K均值聚类分析

    SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...

  3. QinQ 技术解析

    目录 1. 概述 2. QinQ 的产生背景 3. QinQ的作用及原理 4. QinQ 技术的优点 5. QinQ 的报文结构 6. QinQ的实现方式 (1) 基本QinQ (2) 灵活QinQ ...

  4. C#内嵌Python架构实现

    C#通过IronPython内嵌Python脚本,实现了对业务逻辑抽象及判断,适合在大量订单需要进行校验的场合使用. 比如,贷款时会对用户进行核查,核查过程可能存在多个节点,并且节点可能会随着政策而不 ...

  5. PHP对象在内存中的分配(转载)

    http://www.cnblogs.com/hongfei/archive/2012/06/12/2547120.html 对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据 ...

  6. 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)

    [解题思路] 给一张神图,推理写的灰常明白了,关键是构造共轭函数,这一点实在是要有数学知识的理论基础,推出了递推式,接下来就是矩阵的快速幂了. 神图: 给个大神的链接:构造类斐波那契数列的矩阵快速幂 ...

  7. NCM格式转换MP3格式

    首先下载软件: 百度网盘下载地址:https://pan.baidu.com/s/1I_HUQGBnOq23Zdm-NgbnqA 提取码:u4m5 下载完毕直接打开就好 添加NCM文件 点击开始转换 ...

  8. 从零开始搭建系统2.1——Nexus安装及配置

    在安装配置Nexus时,请先确定您已经配置好jdk 1.创建目录 2.下载安装包 [root@localhost usr]# cd nexus 下载地址:https://www.sonatype.co ...

  9. DEV插件下的控件Grid和Gridlookupedit控件的结合使用

    创建GridlookupEtid控件 设置其对应属性: 设置属性 this.gridLookUpEdit1.Properties.TextEditStyle = DevExpress.XtraEdit ...

  10. UML关系类图

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...