Java多線(xiàn)程模式之Balking模式詳解
本文實(shí)例講述了Java多線(xiàn)程模式之Balking模式。分享給大家供大家參考,具體如下:
當(dāng)現(xiàn)在不適合這個(gè)操作,或是沒(méi)有必要進(jìn)行這個(gè)操作時(shí)就直接放棄這個(gè)操作而回去。這個(gè)就是Balking模式
例如王某在餐廳吃飯,當(dāng)王某需要點(diǎn)餐時(shí)喊服務(wù)員需要點(diǎn)餐。當(dāng)服務(wù)員A和B都注意到了王某點(diǎn)餐的示意,這時(shí)服務(wù)員B看到服務(wù)員A已經(jīng)去響應(yīng)了王某的點(diǎn)餐請(qǐng)求,所以服務(wù)員B就不會(huì)再過(guò)去響應(yīng)王某的點(diǎn)餐請(qǐng)求。
程序示例:
程序的需求是模擬一個(gè)自動(dòng)保存的功能。自動(dòng)保存是為了預(yù)防計(jì)算機(jī)忽然斷電或則軟件突然出錯(cuò)的危險(xiǎn),定期將數(shù)據(jù)保存在文件里的功能。
1、Data類(lèi):表示是否修改,及修改函數(shù)的類(lèi)
2、SaveThread類(lèi):定期保存
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ù)的類(lèi) * @author zhengyi * */ public class Data { private final String fileName; //文件名稱(chēng) 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 * 注:這個(gè)方法是用synchronized修飾的 * 為了保護(hù)content與changed屬性用 * synchronized修飾后就只能同時(shí)有 * 1個(gè)線(xiàn)程訪(fǎng)問(wèn)也就防止了多線(xiàn)程造成的臟數(shù)據(jù) * @param newContent */ public synchronized void change(String newContent){ content=newContent; changed=true; } /** * 保存 */ public synchronized void save(){ if(!changed){ //當(dāng)changed值為false時(shí)直接return出去 return ; }else{ doSave();//調(diào)用保存方法 changed=false; //保存后changed的值修改為false } } /** * 具體的修改方法,模擬寫(xiě)到文本中。 */ private void doSave(){ System.out.println("線(xiàn)程名稱(chēng):"+Thread.currentThread().getName()+",最新需要保存的值="+content); try { Writer writer=new FileWriter(fileName); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }
package org.zhy.demo04; /** * 定期保存的類(lèi) * @author zhengyi * */ public class SaveThread extends Thread{ private Data data; public SaveThread(String name,Data data){ super(name);//線(xiàn)程名稱(chēng) 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ù),保存文件的類(lèi) * @author zhengyi * */ public class ChangeThread extends Thread{ private Data data; private Random random=new Random(); public ChangeThread(String name,Data data){ super(name);//線(xiàn)程名稱(chēng) 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)容"); //文件的名稱(chēng)及文件的默認(rèn)內(nèi)容 new ChangeThread("ChangeThread", data).start(); //手動(dòng)保存 new SaveThread("SaveThread", data).start(); //自動(dòng)保存 } }
運(yùn)行結(jié)果:
什么時(shí)候使用Balking模式?
1、不需要刻意去執(zhí)行的時(shí)候
2、不想等待警戒條件時(shí)
3、警戒條件只有一次成立時(shí)
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java實(shí)現(xiàn)SSL雙向認(rèn)證的方法
這篇文章主要介紹了Java實(shí)現(xiàn)SSL雙向認(rèn)證的方法,實(shí)例分析了ssl認(rèn)證的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08Spring使用aop切面編程時(shí)要給那些類(lèi)加注解的實(shí)例
在使用切面編程時(shí),通常需要為以下類(lèi)或組件添加注解來(lái)標(biāo)識(shí)它們,以便 Spring 或其他切面框架能夠正確識(shí)別和處理它們,這篇文章主要介紹了Spring使用aop切面編程時(shí)要給那些類(lèi)加注解,需要的朋友可以參考下2023-11-11教你如何在IDEA?中添加?Maven?項(xiàng)目的?Archetype(解決添加不起作用的問(wèn)題)
這篇文章主要介紹了如何在?IDEA?中添加?Maven?項(xiàng)目的?Archetype(解決添加不起作用的問(wèn)題),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08Springboot 整合 Java DL4J 實(shí)現(xiàn)智能客服功能
本文主要介紹了如何使用SpringBoot整合JavaDeeplearning4j來(lái)構(gòu)建一個(gè)智能客服系統(tǒng),詳細(xì)探討了神經(jīng)網(wǎng)絡(luò)選擇、數(shù)據(jù)集格式、技術(shù)介紹、Maven依賴(lài)、代碼示例等內(nèi)容,為構(gòu)建高效、便捷、個(gè)性化的客戶(hù)服務(wù)提供了理論支持和實(shí)踐指導(dǎo)2024-10-10idea為java程序添加啟動(dòng)參數(shù)的問(wèn)題解析(program?arguments,vm?arguments,Envi
這篇文章主要介紹了idea為java程序添加啟動(dòng)參數(shù)的問(wèn)題解析(program?arguments,vm?arguments,Environment?variable)并在程序中獲取使用,本文給大家分享問(wèn)題描述及解決方法,需要的朋友可以參考下2023-09-09Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解
這篇文章主要介紹了Java實(shí)現(xiàn)SMS短信通發(fā)送手機(jī)驗(yàn)證碼案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08關(guān)于Java如何正確地實(shí)現(xiàn)方法重載詳解
在一個(gè)類(lèi)中,可以定義多個(gè)構(gòu)造方法,這叫做方法的重載!但是關(guān)于方法重載,具有有哪些要求和細(xì)節(jié)?在今天的這篇文章中,小編給大家詳細(xì)說(shuō)說(shuō)方法重載相關(guān)的內(nèi)容,需要的朋友可以參考下2023-05-05