多线程设计模式之——Balking Pattern

Balking Pattern 与 Guarded Suspension Pattern 都需要警戒条件,只不过Balking Pattern中,当警戒条件不成立时,不进行wait,直接中断。

[color=brown]Balking Pattern的适用性:[/color]
1.不需要刻意执行的时候,balk可以提高性能
2.不想等待警戒条件成立的时候
3.警戒条件只需第一次成立的时候,例如初始化操作

例子:仅类似“自动保存功能”,通过此模式,防止重复保存。

所需的类:
Date:数据类;
AutosaverThread:定期自动保存数据的线程类;
ChngsaverThread:自己修改并保存的线程类;
Main:测试类


[color=brown]//Date.java[/color]
import java.io.FileWriter;
import java.io.IOException;
public class Date {
public final String filename; //保存的文件名
public String context; //保存的内容
public boolean changedFlag; //若内容修改后,没被保存,则为true

public Date(String filename , String context){
this.filename = filename;
this.context = context;
this.changedFlag = true;
}

//内容修改方法
public synchronized void change(String newcontext){
context = newcontext;
changedFlag = true;
}

//若内容有修改,则保存
public synchronized void save() throws IOException{
if(!changedFlag){ //警戒条件
return; //即balk操作,若已保存或未修改,则终止操作
}
doSave();
changedFlag = false;
}

//实际将数据保存到文件中的方法
public void doSave() throws IOException{
System.out.println(Thread.currentThread().getName() + " calls doSave, context:" + context);
FileWriter fw = new FileWriter(filename);
fw.write(context);
fw.close();
}

}



[color=brown]//AutosaverThread.java[/color]

import java.io.IOException;
public class AutosaverThread extends Thread{
private Date date;

AutosaverThread(String name , Date date){
super(name);
this.date = date;
}

public void run(){
try{
while(true){
date.save();
Thread.sleep(1000);
}
}catch(InterruptedException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}

}


[color=brown]//ChngsaverThread.java[/color]

import java.io.IOException;
import java.util.Random;
public class ChngsaverThread extends Thread{
private Date date;
private Random random = new Random();

ChngsaverThread(String name , Date date){
super(name);
this.date = date;
}

public void run(){
for(int i=1; i<21; i++){
try {
date.change("he is fang" + i);
Thread.sleep(random.nextInt(1000));
date.save();
} catch (InterruptedException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}

}
}

}



[color=brown]//Main.java[/color]

public class Main {

public static void main(String[] args) {
Date date = new Date("d.txt", "i am lulu ");
new AutosaverThread("AAAAthread", date).start();
new ChngsaverThread("CCCCthread", date).start();
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值