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

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

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

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

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


//Date.java 
Java代码    收藏代码
  1. import java.io.FileWriter;  
  2. import java.io.IOException;  
  3. public class Date {  
  4.     public final String filename; //保存的文件名  
  5.     public String context;        //保存的内容  
  6.     public boolean changedFlag;   //若内容修改后,没被保存,则为true  
  7.       
  8.     public Date(String filename , String context){  
  9.         this.filename = filename;  
  10.         this.context = context;  
  11.         this.changedFlag = true;  
  12.     }  
  13.       
  14.     //内容修改方法  
  15.     public synchronized void change(String newcontext){  
  16.         context = newcontext;  
  17.         changedFlag = true;  
  18.     }  
  19.       
  20.     //若内容有修改,则保存  
  21.     public synchronized void save() throws IOException{  
  22.         if(!changedFlag){       //警戒条件  
  23.             return;             //即balk操作,若已保存或未修改,则终止操作  
  24.         }  
  25.         doSave();  
  26.         changedFlag = false;  
  27.     }  
  28.       
  29.     //实际将数据保存到文件中的方法  
  30.     public void doSave() throws IOException{  
  31.         System.out.println(Thread.currentThread().getName() + " calls doSave, context:" + context);  
  32.         FileWriter fw = new FileWriter(filename);  
  33.         fw.write(context);  
  34.         fw.close();  
  35.     }  
  36.   
  37. }  



//AutosaverThread.java 

Java代码    收藏代码
  1. import java.io.IOException;  
  2. public class AutosaverThread extends Thread{  
  3.     private Date date;  
  4.       
  5.     AutosaverThread(String name , Date date){  
  6.         super(name);  
  7.         this.date = date;  
  8.     }  
  9.       
  10.     public void run(){  
  11.         try{  
  12.             while(true){  
  13.                 date.save();  
  14.                 Thread.sleep(1000);  
  15.                 }  
  16.             }catch(InterruptedException e){  
  17.                 e.printStackTrace();  
  18.             }catch(IOException e){  
  19.                 e.printStackTrace();  
  20.             }  
  21.         }  
  22.   
  23. }  


//ChngsaverThread.java 

Java代码    收藏代码
  1. import java.io.IOException;  
  2. import java.util.Random;  
  3. public class ChngsaverThread extends Thread{  
  4.     private Date date;  
  5.     private Random random = new Random();  
  6.       
  7.     ChngsaverThread(String name , Date date){  
  8.         super(name);  
  9.         this.date = date;  
  10.     }  
  11.       
  12.     public void run(){  
  13.         for(int i=1; i<21; i++){  
  14.             try {  
  15.                 date.change("he is fang" + i);  
  16.                 Thread.sleep(random.nextInt(1000));  
  17.                 date.save();  
  18.             } catch (InterruptedException e) {  
  19.                 e.printStackTrace();  
  20.             }catch (IOException e) {  
  21.                 e.printStackTrace();  
  22.             }  
  23.               
  24.         }  
  25.     }  
  26.   
  27. }  



//Main.java 

Java代码    收藏代码
  1. public class Main {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Date date = new Date("d.txt""i am lulu ");  
  5.         new AutosaverThread("AAAAthread", date).start();  
  6.         new ChngsaverThread("CCCCthread", date).start();  
  7.     }  
  8.   
  9. }  

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值