电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java并發(fā)編程之線程間的通信

瀏覽:22日期:2022-08-10 11:47:49
目錄一、概念簡介1、線程通信2、等待通知機(jī)制3、基礎(chǔ)方法二、等待通知原理1、基本原理2、實(shí)現(xiàn)案例三、管道流通信1、管道流簡介2、使用案例四、生產(chǎn)消費(fèi)模式1、業(yè)務(wù)場景2、代碼實(shí)現(xiàn)五、源代碼地址一、概念簡介1、線程通信

在操作系統(tǒng)中,線程是個(gè)獨(dú)立的個(gè)體,但是在線程執(zhí)行過程中,如果處理同一個(gè)業(yè)務(wù)邏輯,可能會產(chǎn)生資源爭搶,導(dǎo)致并發(fā)問題,通常使用互斥鎖來控制該邏輯。但是在還有這樣一類場景,任務(wù)執(zhí)行是有順序控制的,例如常見的報(bào)表數(shù)據(jù)生成:

Java并發(fā)編程之線程間的通信

啟動數(shù)據(jù)分析任務(wù),生成報(bào)表數(shù)據(jù); 報(bào)表數(shù)據(jù)存入指定位置數(shù)據(jù)容器; 通知數(shù)據(jù)搬運(yùn)任務(wù),把數(shù)據(jù)寫入報(bào)表庫;

該場景在相對復(fù)雜的系統(tǒng)中非常常見,如果基于多線程來描述該過程,則需要線程之間通信協(xié)作,才能有條不紊的處理該場景業(yè)務(wù)。

2、等待通知機(jī)制

如上的業(yè)務(wù)場景,如果線程A生成數(shù)據(jù)過程中,線程B一直在訪問數(shù)據(jù)容器,判斷該過程的數(shù)據(jù)是否已經(jīng)生成,則會造成資源浪費(fèi)。正常的流程應(yīng)該如圖,線程A和線程B同時(shí)啟動,線程A開始處理數(shù)據(jù)生成任務(wù),線程B嘗試獲取容器數(shù)據(jù),數(shù)據(jù)還沒過來,線程B則進(jìn)入等待狀態(tài),當(dāng)線程A的任務(wù)處理完成,則通知線程B去容器中獲取數(shù)據(jù),這樣基于線程等待和通知的機(jī)制來協(xié)作完成任務(wù)。

3、基礎(chǔ)方法

等待/通知機(jī)制的相關(guān)方法是Java中Object層級的基礎(chǔ)方法,任何對象都有該方法:

notify:隨機(jī)通知一個(gè)在該對象上等待的線程,使其結(jié)束wait狀態(tài)返回; notifyAll:喚醒在該對象上所有等待的線程,進(jìn)入對象鎖爭搶隊(duì)列中; wait:線程進(jìn)入waiting等待狀態(tài),不會爭搶鎖對象,也可以設(shè)置等待時(shí)間;

線程的等待通知機(jī)制,就是基于這幾個(gè)基礎(chǔ)方法。

二、等待通知原理1、基本原理

等待/通知機(jī)制,該模式下指線程A在不滿足任務(wù)執(zhí)行的情況下調(diào)用對象wait()方法進(jìn)入等待狀態(tài),線程B修改了線程A的執(zhí)行條件,并調(diào)用對象notify()或者notifyAll()方法,線程A收到通知后從wait狀態(tài)返回,進(jìn)而執(zhí)行后續(xù)操作。兩個(gè)線程通過基于對象提供的wait()/notify()/notifyAll()等方法完成等待和通知間交互,提高程序的可伸縮性。

2、實(shí)現(xiàn)案例

通過線程通信解決上述數(shù)據(jù)生成和存儲任務(wù)的解耦流程。

public class NotifyThread01 { static Object lock = new Object() ; static volatile List<String> dataList = new ArrayList<>(); public static void main(String[] args) throws Exception {Thread saveThread = new Thread(new SaveData(),'SaveData');saveThread.start();TimeUnit.SECONDS.sleep(3);Thread dataThread = new Thread(new AnalyData(),'AnalyData');dataThread.start(); } // 等待數(shù)據(jù)生成,保存 static class SaveData implements Runnable {@Overridepublic void run() { synchronized (lock){while (dataList.size()==0){ try {System.out.println(Thread.currentThread().getName()+'等待...');lock.wait(); } catch (InterruptedException e) {e.printStackTrace(); }}System.out.println('SaveData ..'+ dataList.get(0)+dataList.get(1)); }} } // 生成數(shù)據(jù),通知保存 static class AnalyData implements Runnable {@Overridepublic void run() { synchronized (lock){dataList.add('hello,');dataList.add('java');lock.notify();System.out.println('AnalyData End...'); }} }}

注意:除了dataList滿足寫條件,還要在AnalyData線程執(zhí)行通知操作。

三、管道流通信1、管道流簡介

基本概念

管道流主要用于在不同線程間直接傳送數(shù)據(jù),一個(gè)線程發(fā)送數(shù)據(jù)到輸出管道,另一個(gè)線程從輸入管道中讀取數(shù)據(jù),進(jìn)而實(shí)現(xiàn)不同線程間的通信。

實(shí)現(xiàn)分類

管道字節(jié)流:PipedInputStream和PipedOutputStream;

管道字符流:PipedWriter和PipedReader;

新IO管道流:Pipe.SinkChannel和Pipe.SourceChannel;

2、使用案例

public class NotifyThread02 { public static void main(String[] args) throws Exception {PipedInputStream pis = new PipedInputStream();PipedOutputStream pos = new PipedOutputStream();// 鏈接輸入流和輸出流pos.connect(pis);// 寫數(shù)據(jù)線程new Thread(new Runnable() { public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 將從鍵盤讀取的數(shù)據(jù)寫入管道流PrintStream ps = new PrintStream(pos);while (true) { try {System.out.print(Thread.currentThread().getName());ps.println(br.readLine());Thread.sleep(1000); } catch (Exception e) {e.printStackTrace(); }} }}, '輸入數(shù)據(jù)線程:').start();// 讀數(shù)據(jù)線程new Thread(new Runnable() { public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(pis));while (true) { try {System.out.println(Thread.currentThread().getName() + br.readLine()); } catch (IOException e) {e.printStackTrace(); }} }}, '輸出數(shù)據(jù)線程:').start(); }}

寫線程向管道流寫入數(shù)據(jù),讀線程讀取數(shù)據(jù),完成基本通信流程。

四、生產(chǎn)消費(fèi)模式1、業(yè)務(wù)場景

基于線程等待通知機(jī)制:實(shí)現(xiàn)工廠生產(chǎn)一件商品,通知商店賣出一件商品的業(yè)務(wù)流程。

2、代碼實(shí)現(xiàn)

public class NotifyThread03 { public static void main(String[] args) {Product product = new Product();ProductFactory productFactory = new ProductFactory(product);ProductShop productShop = new ProductShop(product);productFactory.start();productShop.start(); }}// 產(chǎn)品class Product { public String name ; public double price ; // 產(chǎn)品是否生產(chǎn)完畢,默認(rèn)沒有 boolean flag ;}// 產(chǎn)品工廠:生產(chǎn)class ProductFactory extends Thread { Product product ; public ProductFactory (Product product){this.product = product; } @Override public void run() {int i = 0 ;while (i < 20) { synchronized (product) {if (!product.flag){ if (i%2 == 0){product.name = '鼠標(biāo)';product.price = 79.99; } else {product.name = '鍵盤';product.price = 89.99; } System.out.println('產(chǎn)品:'+product.name+'【價(jià)格:'+product.price+'】出廠...'); product.flag = true ; i++; // 通知消費(fèi)者 product.notifyAll();} else { try {// 進(jìn)入等待狀態(tài)product.wait(); } catch (InterruptedException e) {e.printStackTrace(); }} }} }}// 產(chǎn)品商店:銷售class ProductShop extends Thread { Product product ; public ProductShop (Product product){this.product = product ; } @Override public void run() {while (true) { synchronized (product) {if (product.flag == true ){ System.out.println('產(chǎn)品:'+product.name+'【價(jià)格'+(product.price*2)+'】賣出...'); product.flag = false ; product.notifyAll(); //喚醒生產(chǎn)者} else { try {product.wait(); } catch (InterruptedException e) {e.printStackTrace(); }} }} }}

流程描述:ProductFactory生成一件商品,通知商店售賣,通過flag標(biāo)識判斷控制是否進(jìn)入等待狀態(tài),商店賣出商品后,再次通知工廠生產(chǎn)商品。

五、源代碼地址

GitHub·地址https://github.com/cicadasmile/java-base-parentGitEE·地址https://gitee.com/cicadasmile/java-base-parent

以上就是Java并發(fā)編程之線程間的通信的詳細(xì)內(nèi)容,更多關(guān)于Java 線程間通信的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | TYPE-C厂家|TYPE-C接口|TYPE-C防水母座|TYPE-C贴片-深圳步步精 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 南京试剂|化学试剂|分析试剂|实验试剂|cas号查询-专业60年试剂销售企业 | 烟台游艇培训,威海游艇培训-烟台市邮轮游艇行业协会 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | DDoS安全防护官网-领先的DDoS安全防护服务商 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 东莞注册公司-代办营业执照-东莞公司注册代理记账-极刻财税 | 纳米涂料品牌 防雾抗污纳米陶瓷涂料厂家_虹瓷科技 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 |