• Balking模式


    Balking模式讲的是如果现在不合适执行这个操作,或者没必要执行这个操作,就停止处理,直接返回

    自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘操作的前提是文件做过修改,如果文件没有执行过修改操作,就需要快速放弃存盘操作

    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; // 为了表示content字段内容与文件内容不一致,未修改状态
        }
    
        // 若数据内容修改过,则保存到文件中
        public synchronized void save() throws IOException {
            if (!changed) {
                return;
            }
            doSave();
            changed = false; // 为了表示content字段内容与文件内容一致,未修改状态
        }
    
        private void doSave() throws IOException {
            System.out.println(Thread.currentThread().getName() + " calls doSave,content=" + content);
            Writer writer = new FileWriter(filename,true);
            writer.write(content);
            writer.close();
        }
    }
    
    public class ChangerThread extends Thread {
        private final Data data;
        private final Random random = new Random();
    
        public ChangerThread(String name, Data data) {
            super(name);
            this.data = data;
        }
    
        public void run() {
            try {
                for (int i = 1; i<=10; i++) {
                    data.change("No." + i); // 修改数据
                    Thread.sleep(random.nextInt(1000)); // 执行其他操作
                    data.save(); // 显示地保存
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                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) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Data data = new Data("C:\Users\Administrator\Desktop\abc.txt", "emtity");
            new ChangerThread("ChangerThread", data).start();
            new SaverThread("SaverThread", data).start();
        }
    }

    单次初始化

    class InitTest{
      boolean inited = false;
      synchronized void init(){
        if(inited){
          return;
        }
        // 省略 doInit 的实现
        doInit();
        inited=true;
      }
    }
  • 相关阅读:
    IDEA工具java开发之 开发中必会的技能
    IDEA工具java开发之项目初始化配置 细节和目录结构
    有关java编辑改变编码器时出现HelloWorld.java:3: 错误: 编码GBK的不可映射字符 * 瀹冨皢鎵撳嵃瀛楃�涓? Hello World
    java开发环境的搭建 第一步安装JDK 第二步配置环境变量 检查java中的jdk是否安装成功
    解决vue中使用echarts的formatter提示警告的问题
    数组去重及element UI 远程模糊查询
    有关echar图设置宽度100%不起作用的问题
    echarts 中的bar3D柱子图在geo3D地图中显示不出来
    【SQL】约束
    【SQL】视图
  • 原文地址:https://www.cnblogs.com/moris5013/p/11779961.html
Copyright © 2020-2023  润新知