欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java多線程之Balking模式介紹

 更新時(shí)間:2022年01月25日 10:54:40   作者:水月風(fēng)情  
大家好,本篇文章主要講的是java多線程之Balking模式介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下

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)表示

總結(jié)

到此這篇關(guān)于java多線程之Balking模式介紹的文章就介紹到這了,更多相關(guān)java多線程Balking模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java List去掉重復(fù)元素的幾種方式(小結(jié))

    java List去掉重復(fù)元素的幾種方式(小結(jié))

    這篇文章主要介紹了java List去掉重復(fù)元素的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 深入了解Java接口回調(diào)機(jī)制

    深入了解Java接口回調(diào)機(jī)制

    這篇文章主要介紹了Java接口回調(diào)機(jī)制,下面我們來(lái)一起學(xué)習(xí)一下吧
    2019-05-05
  • Java Math類、Random類、System類及BigDecimal類用法示例

    Java Math類、Random類、System類及BigDecimal類用法示例

    這篇文章主要介紹了Java Math類、Random類、System類及BigDecimal類用法,結(jié)合實(shí)例形式分析了java數(shù)值運(yùn)算相關(guān)的Math類、Random類、System類及BigDecimal類基本功能與使用技巧,需要的朋友可以參考下
    2019-03-03
  • Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換

    Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換

    有時(shí)候我們有多個(gè)項(xiàng)目需要使用多個(gè)版本JDK,本文主要介紹了Mac安裝多個(gè)JDK并實(shí)現(xiàn)動(dòng)態(tài)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • java后臺(tái)啟動(dòng)jar包的一些命令匯總

    java后臺(tái)啟動(dòng)jar包的一些命令匯總

    這篇文章主要介紹了java后臺(tái)啟動(dòng)jar包的一些命令匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-03-03
  • eclipse+maven+spring mvc項(xiàng)目基本搭建過(guò)程

    eclipse+maven+spring mvc項(xiàng)目基本搭建過(guò)程

    這篇文章主要介紹了eclipse+maven+spring mvc項(xiàng)目基本搭建過(guò)程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字)

    詳解Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字)

    這篇文章主要介紹了Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解

    JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解

    上次我們說(shuō)到View的Mearsure流程,今天接著說(shuō)說(shuō)layout. 關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來(lái)看看吧,需要的朋友可以參考下
    2021-05-05
  • SpringBoot日志配置簡(jiǎn)單介紹

    SpringBoot日志配置簡(jiǎn)單介紹

    這篇文章主要介紹了SpringBoot日志配置,需要的朋友可以參考下
    2017-09-09

最新評(píng)論