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

来源:互联网 发布:url编码 java 编辑:程序博客网 时间:2024/06/11 09:11
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"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击