文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java多线程之Balking模式介绍

2024-04-02 19:55

关注

Balk有拒绝,阻碍的意思。如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。这就是Balking模式。

Balking 模式可以和Guarded Suspension 模式对比,都存在守护条件。而在Balking模式中,如果守护条件不成立就立即中断处理,而Guarded Suspension 模式则是一直等待至可以运行。

创建4个类

名字说明
Data表示可以修改并保存的数据的类
SaverThread定期保存数据内容的类
ChangerThread修改并保存数据内容的类
Main测试类
 
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
 
public class Data {
 
    private final  String fileName;
    private String content;
    private boolean changed;
 
    public Data(String fileName, String content) {
        this.fileName = fileName;
        this.content = content;
    }
 
    // 修改数据内容
    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 {
        System.out.println(Thread.currentThread().getName() + " calls doSave,content= " + content);
        Writer writer = new FileWriter(fileName);
        writer.write(content);
        writer.close();
    }
}
import java.io.IOException;
 
public class SaverThread extends  Thread{
 
    private final Data data;
 
    public SaverThread(String fileName ,Data data) {
        super(fileName);
        this.data = data;
    }
 
    @Override
    public void run() {
        try {
            while (true) {
                data.save();   // 要求保存数据
                Thread.sleep(1000);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
    }
}
import java.util.Random;
 
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;
    }
 
    @Override
    public void run() {
        try {
            for (int i = 0; true; i++) {
                data.change("No." + i);   // 修改数据
                Thread.sleep(random.nextInt(1000));  // 执行其他操作 ,只是随机暂停一段时间
                data.save();   // 显式的保存
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这里注意Data类的doSava方法每次都是重新创建文件,文件内容会全部消失,该示例不能直接用作应用程序的自动保存功能,如果想做,必须对文件进行备份。

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

运行结果:没有出现重复的编号。

Balking 模式中的登场角色

GuardedObject (被保护的对象)

GuardedObject 角色是一个拥有被防护的方法(guardedMethod)的类。当线程执行guardedMethod方法时,若守护条件成立,则执行实际的处理。反之,直接返回。守护条件的成立与否会随着GuardedObject 角色的状态变化而改变。

除了guardedMethod方法外,GuardedObject应该有改变状态的方法(StateChangingMethod)。在上面示例中,由Data扮演此角色,sava方法则是guardedMethod,change方法则是StateChangingMethod。守护条件对应的是change属性为true;

使用场景:

1 并不需要执行时

比如写文件时,如果文件内容没有变化,则无需再写,提高程序性能。

2  不需要等待守护条件成立时

Balking模式的特点就是不进行等待,一旦守护条件不成立时,可以立即返回并进入下一个操作。这能够大大提高程序的相应性。

3 守护条件仅在第一次成立时

例如我们先看看下面的代码

 
public class Something {
    private boolean initialized =false;
    public synchronized void init(){
        if (initialized){
            return;
        }
        doInit();
        initialized = true;
    }
    
    private void doInit(){
        // 处理逻辑
    }
}

initialized 表示初始化是否完成,而这里一旦初始化完成,initialized 就为true,而且状态就永远不会发生变化了。所以守护条件不成立时,直接返回。像这种initialized 字段,状态仅变化一次的变量,我们通常称为闭锁。一旦把门锁上了,就再也打不开了。

balk结果的表示方式:当从guardedMethod方法中balk并返回时,有如下表示方式

忽略balk通过返回值来表示balk,如true,false可以通过 异常的方式来表示

总结

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯