Balking模式--不需要就算了

定義:

Balking模式也有守護條件,如果守護條件不成立,立即中斷處理。

引例

名字 說明
Data  
SaverThread  
ChangeThread  
Main  
public class Data {
    private String filename;    //修改是的名字
    private String content;     // 資料的內容
    private boolean changed;    //修改後的內容還沒存儲的話,值爲true

    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 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 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();
        }
    }
}
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();
    }
}

結果: 

SaverThread calls doSave, content = No.0
ChangerThread balks
ChangerThread calls doSave, content = No.1
SaverThread calls doSave, content = No.2
ChangerThread balks
ChangerThread calls doSave, content = No.3
ChangerThread calls doSave, content = No.4
SaverThread calls doSave, content = No.5

 Balking模式角色

GuardedObject(被守護的對象)是一個持有被守護方法的類。當線程執行守護方法時,若守護條件成立則執行,若不成立則直接返回。守護條件的成立會隨着被守護的對象狀態發生改變。

何時使用Balking模式

並不需要執行時、不需要等待守護條件時、守護條件僅在第一次成立時

tips:

synchronized中沒有超時,也不能中斷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章