Balking模式(不需要就算了)
如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回----这就是balking模式
下面看一个相关源码的实例
Data类用于表示当前数据
filenname表示文件的名称,context表示写入文件的内容,changed表示context值是否被修改
change()方法修改context内容,同时设置changed为true
save()方法先检查写入内容是否为新的内容,不是则直接退出,如果是则会执行doSave()操作(将内容写入文本),执行dosave()之后再讲changed赋值为false,表示文本的内容与写入的内容相同,
public class Data {
private final String filename;//保存的文件名称
private String context;//数据内容
private boolean changed;//修改后的内容若未保存,则为true
public Data(String filename,String context){
this.filename = filename;
this.context = context;
this.changed = changed;
}
//修改数据内容
public synchronized void change(String newContext){
context = newContext;
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()+"context="+context);
Writer writer = new FileWriter(filename);
writer.write(context);
writer.close();
}
}
saverThread类用于定期保存数据内容
public class SaverThread extends Thread{
private final Data data;
public SaverThread(String name,Data data){
super(name);
this.data = data;
}
public void run(){
try {
while(true){
data.save();//要求保存数据
Thread.sleep(1000);//休眠约1秒
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ChangerThread类用于修改数据内容,并执行保存处理。
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 (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Main方法执行测试用例效果
public class Main {
public static void main(String[] args) {
Data data = new Data("D://data.txt", "empty");
new ChangerThread("changerThread", data).start();
new SaverThread("saverThread", data).start();
}
}
执行结果如下:
GuardedObject(被防护的对象)
GuardedObject 角色是一个拥有被防护的方法的类,当线程执行guardedMethod方法时,若守护条件成立,则执行实际的处理。当守护条件不成立,则不执行实际的处理。守护条件的成功与否,会随着GuardedObject的变化而变化。
如下是Balking模式的TImerthreads图:
balking模式使用的情况:
并不需要执行时
不需要等待条件成立时
守护条件仅在第一次成立
Balking模式的总结:
使用if来检查守护条件,balk处理的执行时使用return 从方法退出,或者使用throw抛出异常,守护条件的检查处理则是使用synchronizde放在临界区中的,这就是Balking模式。