欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Java多线程中的Balking模式详解

时间:2023-01-18 11:00:23|栏目:JAVA代码|点击:

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

总结

上一篇:FeignClient实现接口调用方式(不同参数形式)

栏    目:JAVA代码

下一篇:Spring Boot和Vue前后端分离项目架构的全过程

本文标题:Java多线程中的Balking模式详解

本文地址:http://www.codeinn.net/misctech/223889.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有