Pattern 參與者 :
* GuardedObject (被守護的物件) :
使用時機 :
* 不需要刻意去等待而後執行 :
像這樣 "不需要等待去執行" 的時候, 就可以使用 Balking Pattern. 在這裡 Balk 的原因是為了要提高程序執行的效能.
* 不想等待警戒條件成立時 :
Balking Pattern 的特徵是 "不等待" . 當警戒條件不成立, 就直接退出, 馬上進行下一個工作. 這是為了提高程序的響應性.
* 警戒條件只有第一次成立 :
當警戒條件只有第一次成立時, 也可以使用 Balking Pattern.
使用範例 :
* Data 類 :
用來模擬數據實體, 具有方法 save 來進行保存的動作與 doSave 來進行寫入的動作. 代碼如下 :
- package dp.thread.ch4;
- import java.io.*;
- public class Data {
- private final String filename; //寫入檔案名
- private String content; //數據內容
- private boolean changed; //記錄是否數據是最新的
- public Data(String fn,String content){
- this.filename = fn;
- this.content = content;
- this.changed = true;
- }
- public synchronized void change(String newContent){
- content = newContent;
- changed = true;
- }
- public synchronized boolean save() throws IOException{ //進行數據保存
- if(!changed){
- return false;
- }
- doSave();
- changed = false;
- return true;
- }
- private void doSave()throws IOException{ //進行數據寫入
- System.out.println(Thread.currentThread().getName()+" calls doSave, content= "+content);
- Writer writer = new FileWriter(filename,true);
- writer.write(content+"\r\n");
- writer.close();
- }
- }
SaverThread 是用來定期要求保存數據的類別. 可透過建構子決定多久保存一次數據. 代碼如下 :
- package dp.thread.ch4;
- import java.io.IOException;
- public class SaverThread extends Thread{
- private Data data;
- private int tc = 100; //Running times
- private long st = 1000; //Thread sleep time (ms)
- public SaverThread(String name, Data d, int c,long st){
- super(name);
- this.data = d;
- if(c>0){
- tc = c;
- }
- if(st>0){
- this.st = st;
- }
- }
- public void run(){
- try{
- int count = 0;
- for(int i=0;i
- if(data.save()){ // 保存數據
- count++;
- }
- Thread.sleep(st); // 休息指定時間
- }
- System.out.println("End of SaverThread...("+count+")");
- }catch(IOException ioe){
- ioe.printStackTrace();
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- }
ChangerThread 類則是用來修改數據, 模擬使用者不訂時保存數據的動作, 代碼如下 :
- package dp.thread.ch4;
- import java.io.*;
- import java.util.Random;
- public class ChangerThread extends Thread{
- private Data data;
- private Random random = new Random();
- private int tc = 100; //執行次數
- public ChangerThread(String name,Data d, int c){
- super(name);
- this.data = d;
- if(c >0 ){
- tc = c;
- }
- }
- public void run(){
- try{
- int count = 0;
- for(int i=0;i
- data.change("No."+i); //修改數據
- Thread.sleep(random.nextInt(1000)); //模擬去做別的事
- if(data.save()){ //明確要求存檔.
- count++;
- }
- }
- System.out.println("End of ChangerThread...("+count+")");
- }catch( IOException ioe ){
- ioe.printStackTrace();
- }catch( InterruptedException e){
- e.printStackTrace();
- }
- }
- }
Main 類別則是用來建立以上物件並進行測試, 代碼如下 :
- package dp.thread.ch4;
- public class Main {
- /**
- * @param args
- */
- public static void main(String[] args) {
- int taskCount = 10;
- Data data = new Data("data.txt","(empty)");
- new ChangerThread("ChangerThread",data,taskCount).start();
- new SaverThread("SaverThread",data,taskCount,1000).start();
- }
- }
Ps. 這裡會發現從No.0 ~ No.9 並不會重覆, 即 SaverThread 與 ChangerThread 並不會重複寫入數據.
補充說明 :
@. Balking Pattern 與 Guarded Suspension Pattern 的中間 :
@. wait 的結束是什麼時候 :
沒有留言:
張貼留言