Java多線程中的Balking模式詳解
1.場景
自動保存功能:
為防止電腦死機(jī),而定期將數(shù)據(jù)內(nèi)容保存到文件中的功能。
2.詳細(xì)說明
當(dāng)數(shù)據(jù)內(nèi)容被修改時,內(nèi)容才會被保存。即當(dāng)寫入的內(nèi)容與上次寫入的內(nèi)容一致時,其實就沒有必要執(zhí)行寫入操作。也就是說,以”數(shù)據(jù)內(nèi)容是否一致”作為守護(hù)條件。若數(shù)據(jù)內(nèi)容相同,則不執(zhí)行寫入操作,直接返回。
3.Balking模式的本質(zhì):停止并返回
如果現(xiàn)在不合適執(zhí)行該操作,或者沒有必要執(zhí)行該操作,就停止處理,直接返回—-Balking模式。
要實現(xiàn)上述描述的場景,我們需要設(shè)計四個類:數(shù)據(jù)類Data,修改內(nèi)容的線程類WriterThread,保存數(shù)據(jù)的線程類,啟動線程的類。類圖如下:
當(dāng)數(shù)據(jù)類Data里的內(nèi)容被修改時,守護(hù)條件”數(shù)據(jù)內(nèi)容是否一致”變?yōu)閒alse,則進(jìn)行保存工作:保存工作可由定時保存功能完成也可由修改內(nèi)容的線程類完成。如果守護(hù)條件為true,則直接返回,不執(zhí)行保存操作。
源代碼如下:
數(shù)據(jù)類
public class Data{ private final String filename;//保存文件的名稱 private String content;//數(shù)據(jù)的內(nèi)容 private boolean changed;//內(nèi)容是否已保存的標(biāo)志,若修改后為保存,則為true public Data(String filename,String content){ this.filename=filename; this.content=content; this.changed=true; } //修改數(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ù)保存到文件中 private void doSave() throws IOException { // TODO Auto-generated method stub StdOut.println(Thread.currentThread().getName()+" calls doSave,content= "+content); Writer writer=new FileWriter(filename); writer.write(content); writer.close(); } }
修改內(nèi)容的線程類
public class WriterThread extends Thread { private final Data data; private final Random random=new Random(); public WriterThread(String name,Data data){ super(name); this.data=data; } public void run(){ try { for(int i=0;true;i++){ data.change("NO."+i);//修改數(shù)據(jù) Thread.sleep(random.nextInt(1000));//執(zhí)行其他操作 data.save(); } } catch (InterruptedException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
定時保存數(shù)據(jù)的線程類
public class SaverThread extends Thread { private final Data data; public SaverThread(String name,Data data){ super(name); this.data=data; } public void run(){ try { while(true){ data.save();//保存數(shù)據(jù) Thread.sleep(1000);//休眠約1秒 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
啟動線程的類
public class Main { public static void main(String[] args) { Data data=new Data("data1.txt", "empty"); new WriterThread("ChangerThead",data).start(); new SaverThread("SaverThread", data).start(); } }
總結(jié)
到此這篇關(guān)于Java多線程中的Balking模式詳解的文章就介紹到這了,更多相關(guān)Java多線程Balking模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Echarts實現(xiàn)數(shù)據(jù)大屏
這篇文章給大家介紹了三步實現(xiàn)SpringBoot全局日志記錄,整合Echarts實現(xiàn)數(shù)據(jù)大屏,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2024-03-03Spring中AOP的切點、通知、切點表達(dá)式及知識要點整理
這篇文章主要介紹了Spring中AOP的切點、通知、切點表達(dá)式及知識要點整理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03Java如何利用狀態(tài)模式(state pattern)替代if else
這篇文章主要給大家介紹了關(guān)于Java如何利用狀態(tài)模式(state pattern)替代if else的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法
本文主要介紹了Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08RestTemplate發(fā)送請求時Cookie的影響及注意事項說明
這篇文章主要介紹了RestTemplate發(fā)送請求時Cookie的影響及注意事項說明,具有很好的參考價值,希望對大家有所幫助。2023-07-07利用Springboot+Caffeine實現(xiàn)本地緩存實例代碼
Caffeine是一個基于Java8開發(fā)的提供了近乎最佳命中率的高性能的緩存庫,下面這篇文章主要給大家介紹了關(guān)于利用Springboot+Caffeine實現(xiàn)本地緩存的相關(guān)資料,需要的朋友可以參考下2023-01-01