java多线程之Balking模式

Balking模式(不需要就算了)

如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回----这就是balking模式

下面看一个相关源码的实例

Data类用于表示当前数据

filenname表示文件的名称,context表示写入文件的内容,changed表示context值是否被修改

change()方法修改context内容,同时设置changedtrue

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模式。

 

猜你喜欢

转载自blog.csdn.net/qq_31350373/article/details/80312509
今日推荐