java多線程之Balking模式介紹
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ù)元素的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java Math類、Random類、System類及BigDecimal類用法示例
這篇文章主要介紹了Java Math類、Random類、System類及BigDecimal類用法,結(jié)合實(shí)例形式分析了java數(shù)值運(yùn)算相關(guān)的Math類、Random類、System類及BigDecimal類基本功能與使用技巧,需要的朋友可以參考下2019-03-03Mac安裝多個(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-07java后臺(tái)啟動(dòng)jar包的一些命令匯總
這篇文章主要介紹了java后臺(tái)啟動(dòng)jar包的一些命令匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-03-03eclipse+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)鍵字),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解
上次我們說(shuō)到View的Mearsure流程,今天接著說(shuō)說(shuō)layout. 關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來(lái)看看吧,需要的朋友可以參考下2021-05-05