含义:当警戒条件不成立时,中断请求。
范例:定义一个保存数据的数据类,一个线程不停添加数据并保存,另一个线程定时保存数据,同时保证数据不能重复。
顺序图:
示例代码:
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。