• 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;
      }
    }
  • 相关阅读:
    iOS MJRefresh的使用 (列表上拉加载更多)
    iOS 后台任务
    ios Alamofire网络插件的使用
    springboot shiro ehcache redis 简单使用
    android BottomNavigationView 简单使用
    iOS ksyhttpcache音视频缓存
    springboot 简单使用shiro登录
    springboot 使用 mybatis + mapper
    [LeetCode] Permutations
    【经典算法】回溯算法
  • 原文地址:https://www.cnblogs.com/moris5013/p/11779961.html
Copyright © 2020-2023  润新知