最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程之Balking模式介紹

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

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

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

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

名字說明
Data表示可以修改并保存的數(shù)據(jù)的類
SaverThread定期保存數(shù)據(jù)內(nèi)容的類
ChangerThread修改并保存數(shù)據(jù)內(nèi)容的類
Main測試類
 
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)容修改過。則保存到文件中
    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)保存功能,如果想做,必須對文件進(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é)果:沒有出現(xiàn)重復(fù)的編號。

Balking 模式中的登場角色

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

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ù)條件對應(yīng)的是change屬性為true;

使用場景:

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

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

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)僅變化一次的變量,我們通常稱為閉鎖。一旦把門鎖上了,就再也打不開了。

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

忽略balk通過返回值來表示balk,如true,false可以通過 異常的方式來表示

總結(jié)

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

相關(guān)文章

  • SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法

    SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法

    Spring Boot是一種流行的Java開發(fā)框架,它提供了許多方便的功能來簡化應(yīng)用程序的開發(fā)和部署,這篇文章主要介紹了SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載,需要的朋友可以參考下
    2023-09-09
  • Java接入微信支付超級詳細(xì)保姆級教程

    Java接入微信支付超級詳細(xì)保姆級教程

    這篇文章主要給大家介紹了關(guān)于Java接入微信支付的相關(guān)資料,包括l 準(zhǔn)備開發(fā)所需的賬號和配置信息、準(zhǔn)備環(huán)境、設(shè)置開發(fā)參數(shù)以及實(shí)現(xiàn)支付接口,回調(diào)地址的設(shè)置和異步回調(diào)通知的處理也是文章的重點(diǎn)內(nèi)容,需要的朋友可以參考下
    2024-12-12
  • 淺談JDK8中的Duration Period和ChronoUnit

    淺談JDK8中的Duration Period和ChronoUnit

    在JDK8中,引入了三個(gè)非常有用的時(shí)間相關(guān)的API:Duration,Period和ChronoUnit。他們都是用來對時(shí)間進(jìn)行統(tǒng)計(jì)的,本文將會(huì)詳細(xì)講解一下這三個(gè)API的使用
    2021-06-06
  • Java基礎(chǔ)-Java編程語言發(fā)展史

    Java基礎(chǔ)-Java編程語言發(fā)展史

    這篇文章主要介紹了Java基礎(chǔ)-Java編程語言發(fā)展簡史,Java源自Sun公司的一個(gè)叫Green的項(xiàng)目,其原先的目的是為家用電子消費(fèi)產(chǎn)品開發(fā)一個(gè)分布式代碼系統(tǒng),這樣就可以將通信和控制信息發(fā)給電冰箱、電視機(jī)、烤面包機(jī)等家用電器,對它們進(jìn)行控制和信息交流,需要的朋友可以參考一下
    2022-01-01
  • Java中super和this關(guān)鍵字詳解

    Java中super和this關(guān)鍵字詳解

    這篇文章主要介紹了Java中super和this關(guān)鍵字詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • 詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法

    詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法

    這篇文章主要介紹了詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 淺析Bean?Searcher?與?MyBatis?Plus?區(qū)別介紹

    淺析Bean?Searcher?與?MyBatis?Plus?區(qū)別介紹

    Bean?Searcher號稱任何復(fù)雜的查詢都可以一行代碼搞定,但?Mybatis?Plus?似乎也有類似的動(dòng)態(tài)查詢功能,最近火起的?Bean?Searcher?與?MyBatis?Plus?倒底有啥區(qū)別?帶著這個(gè)問題一起通過本文學(xué)習(xí)下吧
    2022-05-05
  • Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入

    Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入

    最近在項(xiàng)目開發(fā)中遇到的一個(gè)excel復(fù)雜表頭的導(dǎo)入數(shù)據(jù)庫操作,下面這篇文章主要給大家介紹了關(guān)于Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java貪吃蛇游戲完善版

    Java貪吃蛇游戲完善版

    這篇文章主要為大家詳細(xì)介紹了Java貪吃蛇游戲完善版,支持菜單操作,鍵盤監(jiān)聽,可加速,減速,統(tǒng)計(jì)得分等功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Java的Flowable工作流之加簽轉(zhuǎn)簽詳解

    Java的Flowable工作流之加簽轉(zhuǎn)簽詳解

    這篇文章主要介紹了Java的Flowable工作流之加簽轉(zhuǎn)簽詳解,Flowable是一個(gè)開源的工作流引擎,它提供了一套強(qiáng)大的工具和功能,用于設(shè)計(jì)、執(zhí)行和管理各種類型的工作流程,需要的朋友可以參考下
    2023-11-11

最新評論

梓潼县| 宜丰县| 筠连县| 左云县| 陇川县| 新疆| 晋江市| 连城县| 衡东县| 阿克陶县| 巴东县| 巫山县| 汝城县| 尤溪县| 阿合奇县| 宁夏| 澎湖县| 延吉市| 松阳县| 大城县| 阿巴嘎旗| 阿拉善左旗| 普安县| 遂昌县| 紫阳县| 始兴县| 东乌珠穆沁旗| 河西区| 巩留县| 郓城县| 涪陵区| 乌兰浩特市| 肃北| 开封县| 铅山县| 长垣县| 仪陇县| 波密县| 澄迈县| 广宁县| 太保市|