Balking模式
如果现在不适合执行这个操作,或者没有必要执行这个操作,就停止处理,直接返回,这就是Balking模式。
示例程序
Data 表示可以修改并保持数据的类
SaverThread 定期保持数据内容的类
ChangerThread 修改并保存数据内容的类
Main 测试程序行为的类
Data类
import java.io.IOException;
import java.io.FileWriter;
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;
this.changed = true;
}
public synchronized void change(String newContent){
content = newContent;
changed = true;
}
public synchronized void save() throws IOException {
if( !changed ){
return;
}
doSave();
changed = true;
}
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();
}
}
SaverThread类
SaverThread类用于定期保存数据内容
import java.io.IOException;
public class SaverThread extends Thread {
private final Data data;
public ServerThread(String name, Data data){
super(name);
this.data = data;
}
public void run(){
try{
while(true){
data.save() //要求保存数据
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ChangerThread 类
ChangerThread类用于修改数据内容,并执行保存处理。
import java.io.IOException;
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;
}
public void run(){
try{
for(int i = 0; true; i++){
data.change("No." + i); //修改数据
Thread.sleep(random.nextInt(1000); //执行其他操作
data.save();
}
} catch (IOException e){
e.printStackTrace();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
Main 类
Main类首先创建一个Data实例,然后ChangerThread和SaverThread的实例会共用该实例,分别启动各自的线程。
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类来扮演此角色,save方法对应的时guardedMethod, change方法对应的则是stateChangingMethod。
守护条件为"changed字段为true"。