Java多線程中的Balking模式詳解
1.場(chǎng)景
自動(dòng)保存功能:
為防止電腦死機(jī),而定期將數(shù)據(jù)內(nèi)容保存到文件中的功能。
2.詳細(xì)說明
當(dāng)數(shù)據(jù)內(nèi)容被修改時(shí),內(nèi)容才會(huì)被保存。即當(dāng)寫入的內(nèi)容與上次寫入的內(nèi)容一致時(shí),其實(shí)就沒有必要執(zhí)行寫入操作。也就是說,以”數(shù)據(jù)內(nèi)容是否一致”作為守護(hù)條件。若數(shù)據(jù)內(nèi)容相同,則不執(zhí)行寫入操作,直接返回。
3.Balking模式的本質(zhì):停止并返回
如果現(xiàn)在不合適執(zhí)行該操作,或者沒有必要執(zhí)行該操作,就停止處理,直接返回—-Balking模式。
要實(shí)現(xiàn)上述描述的場(chǎng)景,我們需要設(shè)計(jì)四個(gè)類:數(shù)據(jù)類Data,修改內(nèi)容的線程類WriterThread,保存數(shù)據(jù)的線程類,啟動(dòng)線程的類。類圖如下:

當(dāng)數(shù)據(jù)類Data里的內(nèi)容被修改時(shí),守護(hù)條件”數(shù)據(jù)內(nèi)容是否一致”變?yōu)閒alse,則進(jìn)行保存工作:保存工作可由定時(shí)保存功能完成也可由修改內(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í)保存數(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();
}
}
}啟動(dòng)線程的類
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring啟動(dòng)后保證創(chuàng)建的對(duì)象不被垃圾回收器回收
最近看到一個(gè)問題是,spring在啟動(dòng)后如何保證創(chuàng)建的對(duì)象不被垃圾回收器回收?。所以本文結(jié)合jvm的垃圾回收機(jī)制和spring中的源代碼做出自己的一點(diǎn)猜測(cè)。有需要的朋友們可以參考借鑒。2016-09-09
springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建)
這篇文章主要介紹了springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建),需要的朋友可以參考下2020-08-08
springboot jackson自定義序列化和反序列化實(shí)例
這篇文章主要介紹了spring boot jackson自定義序列化和反序列化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的操作方法
隨著安全性的要求越來越高,目前許多項(xiàng)目中都使用了驗(yàn)證碼,驗(yàn)證碼也有各種類型,如 圖形驗(yàn)證碼、短信驗(yàn)證碼、郵件驗(yàn)證碼、人臉識(shí)別等,本文給大家介紹SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的方法,感興趣的朋友跟隨小編一起看看吧2024-07-07
Java實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)將類數(shù)據(jù)逐行寫入CSV文件,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以借鑒一下2022-11-11
Springboot設(shè)置統(tǒng)一的返回格式的方法步驟
在我們應(yīng)用中我們通常與前端交互使用json格式,設(shè)置統(tǒng)一的返回json 格式是非常必要的,本文主要介紹了Springboot設(shè)置統(tǒng)一的返回格式的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

