Java多线程中的Balking模式详解

 更新时间:2022年01月25日 10:39:54   作者:脑机接口社区  
大家好,本篇文章主要讲的是Java多线程中的Balking模式详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

1.场景

自动保存功能:

为防止电脑死机,而定期将数据内容保存到文件中的功能。

2.详细说明

当数据内容被修改时,内容才会被保存。即当写入的内容与上次写入的内容一致时,其实就没有必要执行写入操作。也就是说,以”数据内容是否一致”作为守护条件。若数据内容相同,则不执行写入操作,直接返回。

3.Balking模式的本质:停止并返回

如果现在不合适执行该操作,或者没有必要执行该操作,就停止处理,直接返回—-Balking模式。

要实现上述描述的场景,我们需要设计四个类:数据类Data,修改内容的线程类WriterThread,保存数据的线程类,启动线程的类。类图如下:

Java多线程模式-Balking模式_多线程

当数据类Data里的内容被修改时,守护条件”数据内容是否一致”变为false,则进行保存工作:保存工作可由定时保存功能完成也可由修改内容的线程类完成。如果守护条件为true,则直接返回,不执行保存操作。

源代码如下:

数据类

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;
    }

    //若数据内容修改过,则保存到文件中
    public synchronized void save() throws IOException{
        if(!changed){
            return;
        }
        doSave();
        changed=false;
    }
    //将数据保存到文件中
    private void doSave() throws IOException {
        // TODO Auto-generated method stub
        StdOut.println(Thread.currentThread().getName()+" calls doSave,content= "+content);
        Writer writer=new FileWriter(filename);
        writer.write(content);
        writer.close();
    }
}

修改内容的线程类

public class WriterThread extends Thread {
    private final Data data;
    private final Random random=new Random();
    public WriterThread(String name,Data data){
        super(name);
        this.data=data;
    }
    public void run(){
        try {
            for(int i=0;true;i++){
                data.change("NO."+i);//修改数据
                Thread.sleep(random.nextInt(1000));//执行其他操作
                data.save();
            }
        } catch (InterruptedException | IOException e) {
            // TODO Auto-generated catch block
            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) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

启动线程的类

public class Main {

    public static void main(String[] args) {
        Data data=new Data("data1.txt", "empty");
        new WriterThread("ChangerThead",data).start();
        new SaverThread("SaverThread", data).start();
    }
}

总结

到此这篇关于Java多线程中的Balking模式详解的文章就介绍到这了,更多相关Java多线程Balking模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 换了最新的idea如何将原来旧版本的idea设置导进新的idea中

    换了最新的idea如何将原来旧版本的idea设置导进新的idea中

    这篇文章主要介绍了换了最新的idea如何将原来旧版本的idea设置导进新的idea中,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot2.x的依赖管理配置

    SpringBoot2.x的依赖管理配置

    这篇文章主要介绍了SpringBoot2.x的依赖管理配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java模拟实现HTTP服务器项目实战

    Java模拟实现HTTP服务器项目实战

    本文主要介绍了Java模拟实现HTTP服务器项目实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Spring Boot快速过滤出一次请求的所有日志

    Spring Boot快速过滤出一次请求的所有日志

    这篇文章主要介绍了Spring Boot快速过滤出一次请求的所有日志,本文讲述了如何使用MDC工具来快速过滤一次请求的所有日志,并通过装饰器模式使得MDC工具在异步线程里也能生效,需要的朋友可以参考下
    2022-11-11
  • Java 将list集合数据按照时间字段排序的方法

    Java 将list集合数据按照时间字段排序的方法

    这篇文章主要介绍了Java 将list集合数据按照时间字段排序,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • java中jvm逃逸问题分析

    java中jvm逃逸问题分析

    本篇文章给大家详细总结了java中jvm逃逸问题的相关内容,有兴趣的朋友可以根据小编一起学习下。
    2018-02-02
  • 基于eclipse-temurin镜像部署spring boot应用的实现示例

    基于eclipse-temurin镜像部署spring boot应用的实现示例

    本文提供了基于eclipse-temurin镜像部署Spring Boot应用的详细实现示例,通过使用Docker镜像,可以轻松地创建和管理Spring Boot应用程序的容器化环境,感兴趣的可以了解一下
    2023-08-08
  • Java适配器模式的实现及应用场景

    Java适配器模式的实现及应用场景

    适配器模式是Java中一种常用的设计模式,它通过将一个类的接口转换成客户端所期望的另一种接口来实现不同接口之间的兼容性。适配器模式主要应用于系统的接口不兼容、需要扩展接口功能以及需要适应不同环境的场景
    2023-04-04
  • mybatis输出SQL格式化方式

    mybatis输出SQL格式化方式

    这篇文章主要介绍了mybatis输出SQL格式化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 分析Java非阻塞算法Lock-Free的实现

    分析Java非阻塞算法Lock-Free的实现

    非阻塞算法一般会使用CAS来协调线程的操作。虽然非阻塞算法有诸多优点,但是在实现上要比基于锁的算法更加繁琐和负责。本文将会介绍两个是用非阻塞算法实现的数据结构。
    2021-06-06

最新评论