Balking是「退縮不前」的意思。Balking Pattern和Guarded Suspension Pattern 同樣須要警惕條件。在Balking Pattern中,當警惕條件不成立時,會立刻中斷,而Guarded Suspension Pattern 則是等待到能夠執行時再去執行。dom
該案例會保存數據的屬性,以前所保存的屬性都會被覆蓋。若是當前數據的屬性與上次保存的屬性並沒有不一樣,就不執行保存。this
Data定義:spa
public class Data { private String filename; // 文件名 private String content; // 數據內容 private boolean changed; // 標識數據是否已修改 public Data(String filename, String content) { this.filename = filename; this.content = content; this.changed = true; } // 修改數據 public synchronized void change(String newContent) { content = newContent; changed = true; } // 若數據有修改,則保存,不然直接返回 public synchronized void save() throws IOException { if (!changed) { System.out.println(Thread.currentThread().getName() + " balks"); return; } doSave(); changed = false; } private void doSave() throws IOException { System.out.println(Thread.currentThread().getName() + " calls doSave, content = " + content); Writer writer = new FileWriter(filename); writer.write(content); writer.close(); } }
修改線程定義:線程
//修改線程模仿「一邊修改文章,一邊保存」 public class ChangerThread extends Thread { private Data data; private 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 (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
存儲線程定義:code
//存儲線程每一個1s,會對數據進行一次保存,就像文本處理軟件的「自動保存」同樣。 public class SaverThread extends Thread { private 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) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
執行:對象
public class Main { public static void main(String[] args) { Data data = new Data("data.txt", "(empty)"); new ChangerThread("ChangerThread", data).start(); new SaverThread("SaverThread", data).start(); } }
Balking 模式的角色以下:blog
GuardedObject參與者是一個擁有被警惕的方法(guardedMethod)的類。當線程執行guardedMethod時,只有知足警惕條件時,纔會繼續執行,不然會當即返回。警惕條件的成立與否,會隨着GuardedObject參與者的狀態而變化。rem
注:上述示例中,Data類就是GuardedObject(被警惕的對象)參與者,save方法是guardedMethod,change方法是stateChangingMethod。
get