溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java的Balking模式怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-01-25 13:40:45 來(lái)源:億速云 閱讀:98 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“java的Balking模式怎么實(shí)現(xiàn)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“java的Balking模式怎么實(shí)現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

Balk有拒絕,阻礙的意思。如果現(xiàn)在不適合執(zhí)行這個(gè)操作,或者沒(méi)必要執(zhí)行這個(gè)操作,就停止處理,直接返回。這就是Balking模式。

Balking 模式可以和Guarded Suspension 模式對(duì)比,都存在守護(hù)條件。而在Balking模式中,如果守護(hù)條件不成立就立即中斷處理,而Guarded Suspension 模式則是一直等待至可以運(yùn)行。

創(chuàng)建4個(gè)類

名字說(shuō)明
Data表示可以修改并保存的數(shù)據(jù)的類
SaverThread定期保存數(shù)據(jù)內(nèi)容的類
ChangerThread修改并保存數(shù)據(jù)內(nèi)容的類
Main測(cè)試類
 import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
 
public class Data {
 
    private final  String fileName;
    private String content;
    private boolean changed;
 
    public Data(String fileName, String content) {
        this.fileName = fileName;
        this.content = content;
    }
 
    // 修改數(shù)據(jù)內(nèi)容
    public synchronized void change(String newContent){
        content = newContent;
        changed = true;
    }
 
    // 若數(shù)據(jù)內(nèi)容修改過(guò)。則保存到文件中
    public synchronized void save() throws IOException {
        if (!changed){
            return;
        }
        doSave();
        changed = false;
 
    }
 
    // 將數(shù)據(jù)內(nèi)容實(shí)際保存到文件中
    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();
    }
}
import java.io.IOException;
 
public class SaverThread extends  Thread{
 
    private final Data data;
 
    public SaverThread(String fileName ,Data data) {
        super(fileName);
        this.data = data;
    }
 
    @Override
    public void run() {
        try {
            while (true) {
                data.save();   // 要求保存數(shù)據(jù)
                Thread.sleep(1000);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
    }
}
import java.util.Random;
 
public class ChangerThread extends  Thread{
 
    private  final Data data;
    private  final Random random = new Random();
 
    public ChangerThread(String name ,Data data) {
        super(name);
        this.data = data;
    }
 
    @Override
    public void run() {
        try {
            for (int i = 0; true; i++) {
                data.change("No." + i);   // 修改數(shù)據(jù)
                Thread.sleep(random.nextInt(1000));  // 執(zhí)行其他操作 ,只是隨機(jī)暫停一段時(shí)間
                data.save();   // 顯式的保存
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

這里注意Data類的doSava方法每次都是重新創(chuàng)建文件,文件內(nèi)容會(huì)全部消失,該示例不能直接用作應(yīng)用程序的自動(dòng)保存功能,如果想做,必須對(duì)文件進(jìn)行備份。

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

運(yùn)行結(jié)果:沒(méi)有出現(xiàn)重復(fù)的編號(hào)。

Balking 模式中的登場(chǎng)角色

GuardedObject (被保護(hù)的對(duì)象)

GuardedObject 角色是一個(gè)擁有被防護(hù)的方法(guardedMethod)的類。當(dāng)線程執(zhí)行g(shù)uardedMethod方法時(shí),若守護(hù)條件成立,則執(zhí)行實(shí)際的處理。反之,直接返回。守護(hù)條件的成立與否會(huì)隨著GuardedObject 角色的狀態(tài)變化而改變。

除了guardedMethod方法外,GuardedObject應(yīng)該有改變狀態(tài)的方法(StateChangingMethod)。在上面示例中,由Data扮演此角色,sava方法則是guardedMethod,change方法則是StateChangingMethod。守護(hù)條件對(duì)應(yīng)的是change屬性為true;

使用場(chǎng)景:

1 并不需要執(zhí)行時(shí)

比如寫文件時(shí),如果文件內(nèi)容沒(méi)有變化,則無(wú)需再寫,提高程序性能。

2  不需要等待守護(hù)條件成立時(shí)

Balking模式的特點(diǎn)就是不進(jìn)行等待,一旦守護(hù)條件不成立時(shí),可以立即返回并進(jìn)入下一個(gè)操作。這能夠大大提高程序的相應(yīng)性。

3 守護(hù)條件僅在第一次成立時(shí)

例如我們先看看下面的代碼

 public class Something {
    private boolean initialized =false;
    public synchronized void init(){
        if (initialized){
            return;
        }
        doInit();
        initialized = true;
    }
    
    private void doInit(){
        // 處理邏輯
    }
}

initialized 表示初始化是否完成,而這里一旦初始化完成,initialized 就為true,而且狀態(tài)就永遠(yuǎn)不會(huì)發(fā)生變化了。所以守護(hù)條件不成立時(shí),直接返回。像這種initialized 字段,狀態(tài)僅變化一次的變量,我們通常稱為閉鎖。一旦把門鎖上了,就再也打不開(kāi)了。

balk結(jié)果的表示方式:當(dāng)從guardedMethod方法中balk并返回時(shí),有如下表示方式

忽略balk通過(guò)返回值來(lái)表示balk,如true,false可以通過(guò) 異常的方式來(lái)表示

讀到這里,這篇“java的Balking模式怎么實(shí)現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI