轻松学习多线程-05-Balking 模式

目录

Balking 模式

Balking 模式是指如果不适合执行这个操作,或者没必要执行这个操作,就停止操作,直接返回。

实际案例

类信息概览:

类名说明
Main.java方法的总入口
SaveThread.java保存线程
Data.java数据
ChangeThread.java变更线程

定义

  • SaveThread.java
package com.github.houbb.thread.learn.easy.learn.balking;

public class SaveThread extends Thread {

    private String name;

    private final Data data;

    public SaveThread(String name, Data data) {
        super(name);
        this.data = data;
    }

    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000);
                data.save();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • Data.java
package com.github.houbb.thread.learn.easy.learn.balking;

public class Data {
    /**
     * 文件名称
     */
    private final String fileName;

    /**
     * 是否变化标识
     */
    private boolean changeFlag;

    /**
     * 内容
     */
    private String content;

    public Data(String fileName, String content) {
        this.fileName = fileName;
        this.content = content;
    }

    public synchronized void change(final String content) {
        this.content = content;
        this.changeFlag = true;
    }

    public synchronized void save() {
        //balking   没有变化直接返回
        if(!changeFlag) {
            return;
        }

        doSave();
        this.changeFlag = false;
    }

    private void doSave() {
        System.out.println(Thread.currentThread().getName() + " calls do save content: "+content+" tO file " + fileName);
    }

}
  • ChangeThread.java
package com.github.houbb.thread.learn.easy.learn.balking;

import java.util.Random;

public class ChangeThread extends Thread {

    private String name;

    private final Data data;

    public ChangeThread(String name, Data data) {
        super(name);
        this.data = data;
    }

    /**
     * 固定 1S 保存一次数据
     */
    @Override
    public void run() {
        Random random = new Random(1000L);
        while(true) {
            try {
                int value = random.nextInt(1000);
                data.change(String.valueOf(value));
                Thread.sleep(value);
                data.save();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

测试

  • Main.java
package com.github.houbb.thread.learn.easy.learn.balking;

public class Main {

    public static void main(String[] args) {
        Data data = new Data("124.txt", "");
        new ChangeThread("CHANGE", data).start();
        new SaveThread("SAVE", data).start();
    }

}
  • 测试结果
CHANGE calls do save content: 487 tO file 124.txt
SAVE calls do save content: 935 tO file 124.txt
SAVE calls do save content: 676 tO file 124.txt
CHANGE calls do save content: 124 tO file 124.txt
SAVE calls do save content: 792 tO file 124.txt
CHANGE calls do save content: 349 tO file 124.txt
SAVE calls do save content: 641 tO file 124.txt

实现方式

UML & Code

UML

Balking-uml

Code

代码地址

Balking

系列导航

多线程系列导航

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值