java多线程系列之模式|第二篇:balking pattern

含义:当警戒条件不成立时,中断请求。

范例:定义一个保存数据的数据类,一个线程不停添加数据并保存,另一个线程定时保存数据,同时保证数据不能重复。

顺序图:

示例代码:

Data:数据载体

package pattern.balking;

public class Data {

    private String name;
    private String content;
    private boolean changed;//保存后值为false


    public Data(String name, String content) {
        this.name = name;
        this.content = content;
        this.changed = true;
    }

    public synchronized  void change(String newContent){
        content=newContent;
        changed=true;
    }

    public synchronized void save(){
        if(!changed){
            return;
        }
        doSave();
        changed=false;
    }

    public void doSave(){
        System.out.println(Thread.currentThread().getName()+" call doSave,content ="+content);

    }


}

ChangerThread:手动保存类

package pattern.balking;

import java.util.Random;

public class ChangerThread extends Thread{

    private Data data;
    private 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("new content【"+i+"】");
                    Thread.sleep(random.nextInt(1000));
                    data.save();
                }
            }catch (Exception e){
                e.printStackTrace();
            }



    }
}

ServerThread:自动保存类,默认1秒保存一次。

package pattern.balking;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ServerThread extends Thread{

    private final Logger log = LoggerFactory.getLogger(this.getClass());
    private Data data;
    public ServerThread(String name,Data data) {
        super(name);
        this.data=data;
    }

    @Override
    public void run() {
            try{
                while(true){
                    data.save();
                    Thread.sleep(1000);
                }
            }catch(Exception e){
                log.error(e.getMessage());
            }

    }
}

Main测试类

package pattern.balking;



public class Main {

    public static void main(String[] args){
      Data data=new Data("data.text","empty");
      new ChangerThread("ChangedThread",data).start();
      new ServerThread("ServerThread",data).start();
    }
}

测试结果:

ServerThread call doSave,content =new content【0】
ChangedThread call doSave,content =new content【1】
ServerThread call doSave,content =new content【2】
ChangedThread call doSave,content =new content【3】
ServerThread call doSave,content =new content【4】
ChangedThread call doSave,content =new content【5】
ServerThread call doSave,content =new content【6】
ServerThread call doSave,content =new content【7】
ChangedThread call doSave,content =new content【8】
ServerThread call doSave,content =new content【9】

。。。

SUCCESS。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值