Java多線程模式之Balking模式詳解
本文實例講述了Java多線程模式之Balking模式。分享給大家供大家參考,具體如下:
當(dāng)現(xiàn)在不適合這個操作,或是沒有必要進行這個操作時就直接放棄這個操作而回去。這個就是Balking模式
例如王某在餐廳吃飯,當(dāng)王某需要點餐時喊服務(wù)員需要點餐。當(dāng)服務(wù)員A和B都注意到了王某點餐的示意,這時服務(wù)員B看到服務(wù)員A已經(jīng)去響應(yīng)了王某的點餐請求,所以服務(wù)員B就不會再過去響應(yīng)王某的點餐請求。
程序示例:
程序的需求是模擬一個自動保存的功能。自動保存是為了預(yù)防計算機忽然斷電或則軟件突然出錯的危險,定期將數(shù)據(jù)保存在文件里的功能。
1、Data類:表示是否修改,及修改函數(shù)的類
2、SaveThread類:定期保存
3、ChangeThread:修改數(shù)據(jù),保存文件
4、Main:模擬數(shù)據(jù)
package org.zhy.demo04;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
* 表示是否修改,及修改函數(shù)的類
* @author zhengyi
*
*/
public class Data {
private final String fileName; //文件名稱
private String content; //修改內(nèi)容
private boolean changed; //是否可以修改
//構(gòu)造函數(shù)
public Data(String fileName,String content){
this.fileName=fileName;
this.content=content;
}
/**
* 新的修改內(nèi)容 如果有新的需要保存的數(shù)據(jù),changed的屬性修改為true
* 注:這個方法是用synchronized修飾的
* 為了保護content與changed屬性用
* synchronized修飾后就只能同時有
* 1個線程訪問也就防止了多線程造成的臟數(shù)據(jù)
* @param newContent
*/
public synchronized void change(String newContent){
content=newContent;
changed=true;
}
/**
* 保存
*/
public synchronized void save(){
if(!changed){ //當(dāng)changed值為false時直接return出去
return ;
}else{
doSave();//調(diào)用保存方法
changed=false; //保存后changed的值修改為false
}
}
/**
* 具體的修改方法,模擬寫到文本中。
*/
private void doSave(){
System.out.println("線程名稱:"+Thread.currentThread().getName()+",最新需要保存的值="+content);
try {
Writer writer=new FileWriter(fileName);
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package org.zhy.demo04;
/**
* 定期保存的類
* @author zhengyi
*
*/
public class SaveThread extends Thread{
private Data data;
public SaveThread(String name,Data data){
super(name);//線程名稱
this.data=data;
}
public void run(){
try {
while(true){
data.save(); //模擬保存方法
Thread.sleep(1000); //休息1秒
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package org.zhy.demo04;
import java.util.Random;
/**
* 修改數(shù)據(jù),保存文件的類
* @author zhengyi
*
*/
public class ChangeThread extends Thread{
private Data data;
private Random random=new Random();
public ChangeThread(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)); //模擬去做別的事情
data.save(); //明確的要求要保存
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package org.zhy.demo04;
public class Main {
public static void main(String[] args) {
Data data=new Data("data.txt", "我是默認(rèn)內(nèi)容"); //文件的名稱及文件的默認(rèn)內(nèi)容
new ChangeThread("ChangeThread", data).start(); //手動保存
new SaveThread("SaveThread", data).start(); //自動保存
}
}
運行結(jié)果:

什么時候使用Balking模式?
1、不需要刻意去執(zhí)行的時候
2、不想等待警戒條件時
3、警戒條件只有一次成立時
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Spring Boot日志收集及鏈路追蹤實現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot日志收集及鏈路追蹤實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Java修改maven的默認(rèn)jdk版本為1.7的方法
這篇文章主要介紹了Java修改maven的默認(rèn)jdk版本為1.7的方法,需要的朋友可以參考下2018-02-02
Spring組件初始化擴展點BeanPostProcessor的作用詳解
本文通過實戰(zhàn)案例和常見應(yīng)用場景詳細(xì)介紹了BeanPostProcessor的使用,并強調(diào)了其在Spring擴展中的重要性,感興趣的朋友一起看看吧2025-03-03

