日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

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

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

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

3、基礎(chǔ)方法

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

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

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

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

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

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

通過(guò)線程通信解決上述數(shù)據(jù)生成和存儲(chǔ)任務(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滿足寫(xiě)條件,還要在AnalyData線程執(zhí)行通知操作。

三、管道流通信1、管道流簡(jiǎn)介

基本概念

管道流主要用于在不同線程間直接傳送數(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);// 寫(xiě)數(shù)據(jù)線程new Thread(new Runnable() { public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 將從鍵盤(pán)讀取的數(shù)據(jù)寫(xiě)入管道流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(); }}

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

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

基于線程等待通知機(jī)制:實(shí)現(xiàn)工廠生產(chǎn)一件商品,通知商店賣(mài)出一件商品的業(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)沒(méi)有 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 = '鍵盤(pán)';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)+'】賣(mài)出...'); product.flag = false ; product.notifyAll(); //喚醒生產(chǎn)者} else { try {product.wait(); } catch (InterruptedException e) {e.printStackTrace(); }} }} }}

流程描述:ProductFactory生成一件商品,通知商店售賣(mài),通過(guò)flag標(biāo)識(shí)判斷控制是否進(jìn)入等待狀態(tài),商店賣(mà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 線程間通信的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲视频国产| 日本不良网站在线观看| 国产精品综合色区在线观看| 久久在线免费| 中文字幕在线高清| 久久精品国内一区二区三区| 成人看片网站| 久久99高清| 欧美综合精品| 视频一区视频二区在线观看| 久久伊人久久| 国产精品一二| 久久国产精品免费精品3p | 精品精品99| 国产欧美日韩在线一区二区 | 国产在线|日韩| 国产精品久久久久av蜜臀| 久久一级电影| 青青国产精品| 欧美精品国产一区| 欧美亚洲三区| 精品欧美日韩精品| 精品久久视频| 在线看片国产福利你懂的| 福利精品在线| 特黄特色欧美大片| 日韩视频二区| 亚洲精品韩国| 国产精品资源| 日韩精品永久网址| 久久亚洲专区| 亚洲综合激情在线| 欧美永久精品| 久久99影视| 久久天堂av| 日韩区欧美区| 精品美女视频| 日韩午夜精品| 国产精品主播| 亚洲二区精品| 久久国产乱子精品免费女| 免费看久久久| 欧美特黄一区| 国产福利资源一区| 尤物tv在线精品| 日本视频中文字幕一区二区三区| 开心激情综合| 青草国产精品| 欧美日韩国产免费观看| 日韩av免费大片| 粉嫩av一区二区三区四区五区 | 日韩精品乱码av一区二区| 欧美日韩国产免费观看 | 欧美影院视频| 日本精品另类| 亚洲区国产区| 亚洲午夜国产成人| 日韩精品免费观看视频| 欧美国产91| 免费视频一区三区| 激情五月综合网| 国产综合激情| 亚洲综合日韩| 中文字幕一区二区精品区| 亚洲制服一区| 欧美永久精品| 久久久久黄色| 欧美成a人免费观看久久| 日韩在线高清| 好吊日精品视频| 丝袜国产日韩另类美女| 亚洲在线观看| 国产精品一区三区在线观看| 视频一区日韩| 欧美国产日本| 国产91一区| 噜噜噜久久亚洲精品国产品小说| 视频在线观看国产精品| 美女视频黄久久| 日韩另类视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 精品一区二区男人吃奶| 成人影视亚洲图片在线| 性感美女一区二区在线观看| 伊人久久成人| 视频一区中文字幕精品 | 黑丝一区二区| 国产欧美一级| 久久裸体视频| 日韩精品久久理论片| 欧美国产美女| 亚洲一区欧美| 成人亚洲一区二区| 综合干狼人综合首页| 国产一区二区三区四区| 夜夜嗨一区二区三区| 久久久久九九精品影院| 美日韩精品视频| 成人午夜精品| 日本色综合中文字幕| 黄色在线网站噜噜噜| 视频一区日韩| 亚洲综合二区| 欧美天堂在线| 日韩精品社区| 国产精品丝袜xxxxxxx| 日韩福利一区| 你懂的亚洲视频| 日韩国产在线一| 伊人成人网在线看| 福利在线一区| 国产一区二区三区亚洲| 国产探花在线精品| 日韩国产欧美视频| 久久国产成人| 蜜桃tv一区二区三区| av一区在线| 欧产日产国产精品视频| 国产一区二区三区国产精品| 欧美日韩一区二区国产| 日本一区二区三区中文字幕| 视频一区免费在线观看| 免费观看久久久4p| 久久午夜精品| 亚洲一区二区三区四区电影 | 美女视频黄久久| 国产精品网址| 日韩**一区毛片| 亚洲不卡视频| 日韩不卡一二三区| 国产亚洲一区二区三区啪| 亚洲在线久久| 视频一区二区欧美| 婷婷综合网站| 黑丝一区二区| 亚洲综合日本| 日韩一区二区三免费高清在线观看| 日韩中文字幕1| 免费人成黄页网站在线一区二区| 蜜桃视频一区二区三区| 久久美女精品| 免费成人性网站| 99视频一区| 日本不卡高清| 久久精品免费看| 久久久久蜜桃| 蜜桃av一区二区| 国产精品网址| 香蕉久久99| 亚洲精品麻豆| 韩国女主播一区二区三区| 久久久精品午夜少妇| 日韩精品一二三四| 国产视频一区二| 99久久精品费精品国产| 国产精品日韩| 精品免费视频| 在线精品亚洲欧美日韩国产| 99久久精品网| 欧美伊人久久| 欧美日韩精品免费观看视完整| 亚洲一区二区三区高清| 四虎国产精品免费观看| 久久伊人亚洲| 黄色亚洲大片免费在线观看| 国产欧美自拍一区| 六月天综合网| 亚洲爱爱视频| 精品淫伦v久久水蜜桃| 国产精品婷婷| 成人自拍av| 国产经典一区| 蜜桃视频在线观看一区| 肉色欧美久久久久久久免费看 | 国产精品传媒麻豆hd| 中文在线一区| 久久久精品午夜少妇| 欧美在线资源| 久久99久久久精品欧美| 涩涩涩久久久成人精品| 欧美.日韩.国产.一区.二区 | 亚洲深夜视频| 久久激情综合网| 鲁大师影院一区二区三区| 亚洲天堂久久| 久久九九精品| 中文字幕一区久| 中文字幕在线免费观看视频| 国产欧美一区| 久久国产欧美日韩精品| 少妇高潮一区二区三区99| 欧美日韩四区| 欧美午夜不卡| 亚洲欧美日韩视频二区| 尤物在线精品| 中文无码日韩欧| 日本不卡在线视频| 日本不卡一区二区| 奇米狠狠一区二区三区| 国产亚洲欧美日韩在线观看一区二区|