Java多線程基礎(六)——Balking模式

1、定義

Balking是「退縮不前」的意思。Balking Pattern和Guarded Suspension Pattern 同樣須要警惕條件。在Balking Pattern中,當警惕條件不成立時,會立刻中斷,而Guarded Suspension Pattern 則是等待到能夠執行時再去執行。dom

2、模式案例

該案例會保存數據的屬性,以前所保存的屬性都會被覆蓋。若是當前數據的屬性與上次保存的屬性並沒有不一樣,就不執行保存。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();
    }
}

3、模式講解

Balking 模式的角色以下:blog

  • GuardedObject(被警惕的對象)參與者

GuardedObject參與者是一個擁有被警惕的方法(guardedMethod)的類。當線程執行guardedMethod時,只有知足警惕條件時,纔會繼續執行,不然會當即返回。警惕條件的成立與否,會隨着GuardedObject參與者的狀態而變化。rem

注:上述示例中,Data類就是GuardedObject(被警惕的對象)參與者,save方法是guardedMethod,change方法是stateChangingMethod。
get

相關文章
相關標籤/搜索