成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java并發編程之線程間的通信

瀏覽:80日期:2022-08-10 11:47:49
目錄一、概念簡介1、線程通信2、等待通知機制3、基礎方法二、等待通知原理1、基本原理2、實現案例三、管道流通信1、管道流簡介2、使用案例四、生產消費模式1、業務場景2、代碼實現五、源代碼地址一、概念簡介1、線程通信

在操作系統中,線程是個獨立的個體,但是在線程執行過程中,如果處理同一個業務邏輯,可能會產生資源爭搶,導致并發問題,通常使用互斥鎖來控制該邏輯。但是在還有這樣一類場景,任務執行是有順序控制的,例如常見的報表數據生成:

Java并發編程之線程間的通信

啟動數據分析任務,生成報表數據; 報表數據存入指定位置數據容器; 通知數據搬運任務,把數據寫入報表庫;

該場景在相對復雜的系統中非常常見,如果基于多線程來描述該過程,則需要線程之間通信協作,才能有條不紊的處理該場景業務。

2、等待通知機制

如上的業務場景,如果線程A生成數據過程中,線程B一直在訪問數據容器,判斷該過程的數據是否已經生成,則會造成資源浪費。正常的流程應該如圖,線程A和線程B同時啟動,線程A開始處理數據生成任務,線程B嘗試獲取容器數據,數據還沒過來,線程B則進入等待狀態,當線程A的任務處理完成,則通知線程B去容器中獲取數據,這樣基于線程等待和通知的機制來協作完成任務。

3、基礎方法

等待/通知機制的相關方法是Java中Object層級的基礎方法,任何對象都有該方法:

notify:隨機通知一個在該對象上等待的線程,使其結束wait狀態返回; notifyAll:喚醒在該對象上所有等待的線程,進入對象鎖爭搶隊列中; wait:線程進入waiting等待狀態,不會爭搶鎖對象,也可以設置等待時間;

線程的等待通知機制,就是基于這幾個基礎方法。

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

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

2、實現案例

通過線程通信解決上述數據生成和存儲任務的解耦流程。

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(); } // 等待數據生成,保存 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)); }} } // 生成數據,通知保存 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線程執行通知操作。

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

基本概念

管道流主要用于在不同線程間直接傳送數據,一個線程發送數據到輸出管道,另一個線程從輸入管道中讀取數據,進而實現不同線程間的通信。

實現分類

管道字節流: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);// 寫數據線程new Thread(new Runnable() { public void run() {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 將從鍵盤讀取的數據寫入管道流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(); }} }}, '輸入數據線程:').start();// 讀數據線程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(); }} }}, '輸出數據線程:').start(); }}

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

四、生產消費模式1、業務場景

基于線程等待通知機制:實現工廠生產一件商品,通知商店賣出一件商品的業務流程。

2、代碼實現

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(); }}// 產品class Product { public String name ; public double price ; // 產品是否生產完畢,默認沒有 boolean flag ;}// 產品工廠:生產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 = '鼠標';product.price = 79.99; } else {product.name = '鍵盤';product.price = 89.99; } System.out.println('產品:'+product.name+'【價格:'+product.price+'】出廠...'); product.flag = true ; i++; // 通知消費者 product.notifyAll();} else { try {// 進入等待狀態product.wait(); } catch (InterruptedException e) {e.printStackTrace(); }} }} }}// 產品商店:銷售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('產品:'+product.name+'【價格'+(product.price*2)+'】賣出...'); product.flag = false ; product.notifyAll(); //喚醒生產者} else { try {product.wait(); } catch (InterruptedException e) {e.printStackTrace(); }} }} }}

流程描述:ProductFactory生成一件商品,通知商店售賣,通過flag標識判斷控制是否進入等待狀態,商店賣出商品后,再次通知工廠生產商品。

五、源代碼地址

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

以上就是Java并發編程之線程間的通信的詳細內容,更多關于Java 線程間通信的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产高清成人在线| 久久久久国产精品麻豆| 精品99999| 美腿丝袜亚洲综合| 亚洲欧美日韩国产| 成人免费在线观看入口| 牛夜精品久久久久久久99黑人| 日韩一区二区三区在线| 韩日精品视频一区| 欧美午夜电影在线播放| 免费成人在线观看视频| 色综合久久久久综合体| 中文字幕一区二区视频| 欧美精品一区三区在线观看| 久久久五月婷婷| 国产不卡高清在线观看视频| 欧美日韩国产高清一区二区三区 | 1024成人网色www| 欧美成人日韩| 国产午夜亚洲精品午夜鲁丝片 | 欧美日韩一区小说| 首页综合国产亚洲丝袜| 久久永久免费| 久久精品国产99国产精品| 欧美日韩高清不卡| 国产精华液一区二区三区| 91精品国产综合久久精品| 国产真实乱对白精彩久久| 欧美理论在线播放| 国产精品 欧美精品| 日韩视频一区在线观看| 成人久久久精品乱码一区二区三区| 日韩免费视频一区| 成人免费观看av| 久久久精品2019中文字幕之3| 欧美成人一区二免费视频软件| 日本一区二区三级电影在线观看 | 亚洲欧洲精品一区| 成人欧美一区二区三区白人 | 亚洲国产精品久久艾草纯爱| 免费永久网站黄欧美| 天堂资源在线中文精品| 日本高清成人免费播放| 精品一区二区久久久| 91精品国产色综合久久ai换脸| 国产精品66部| www国产成人免费观看视频 深夜成人网| 欧美一区成人| 亚洲精品水蜜桃| 美女诱惑一区| 久久激情五月激情| 日韩欧美国产三级电影视频| 91在线精品一区二区| 国产精品久久久久久久久搜平片 | 精品三级在线看| 欧美国产三级| 亚洲激情第一区| 久久天天综合| 国产精品一区二区在线观看不卡| wwwwww.欧美系列| 亚洲一级特黄| 日本美女一区二区三区| 日韩欧美www| 精品不卡一区二区三区| 午夜精品久久一牛影视| 欧美精品日韩精品| 欧美xxx在线观看| 亚洲成在人线免费| 欧美精品v国产精品v日韩精品| 成人av网站大全| 自拍偷拍国产亚洲| 久久久久久久久久久久久9999| 麻豆精品新av中文字幕| 欧美精品一区二区高清在线观看| 激情欧美国产欧美| 蜜桃91丨九色丨蝌蚪91桃色| 欧美xingq一区二区| 在线电影一区| 日本欧美肥老太交大片| 久久青草欧美一区二区三区| 亚洲精品国产日韩| 激情综合五月婷婷| 国产精品久久久久精k8| 一本大道久久精品懂色aⅴ| 国产精品一品二品| 18欧美亚洲精品| 欧美综合天天夜夜久久| av网站一区二区三区| 亚洲男同1069视频| 欧美精品丝袜中出| 在线成人国产| 国产精品一区二区三区乱码| 欧美国产成人精品| 一本一本大道香蕉久在线精品 | 国产成都精品91一区二区三| 国产精品丝袜久久久久久app| 色悠悠亚洲一区二区| 国产成a人亚洲精品| 亚洲欧美激情视频在线观看一区二区三区 | 99精品国产视频| 亚洲综合色视频| 日韩欧美中文一区二区| 一区二区激情| av在线不卡电影| 青青草原综合久久大伊人精品 | 国产夜色精品一区二区av| 国产亚洲一区在线播放| 国产成人自拍网| 亚洲在线观看免费视频| 51久久夜色精品国产麻豆| 亚洲激情精品| 粉嫩欧美一区二区三区高清影视| 亚洲成在线观看| 国产三级精品在线| 欧美精品久久一区二区三区| 99re6热在线精品视频播放速度| 国产精品一卡二卡在线观看| 亚洲精品五月天| 久久人人超碰精品| 欧美日韩一区二区三区免费看 | 在线免费日韩片| 国产黄人亚洲片| 亚洲.国产.中文慕字在线| 国产清纯白嫩初高生在线观看91 | 九一九一国产精品| 亚洲综合免费观看高清在线观看| 久久综合丝袜日本网| 欧美伊人久久久久久久久影院| 亚洲国产91| 91亚洲男人天堂| 久久国产成人午夜av影院| 一区二区三区久久| 久久这里只有精品6| 欧美日韩情趣电影| 鲁大师成人一区二区三区| 欧美日韩综合精品| 成人午夜激情在线| 国内精品视频666| 天天色图综合网| 亚洲欧美一区二区久久 | 日韩电影在线免费看| 一区二区中文字幕在线| 精品1区2区在线观看| 欧美日本视频在线| 久久久久综合| 国产伦精品一区二区三区视频黑人| 欧美福利电影在线观看| 国产成人精品www牛牛影视| 日韩 欧美一区二区三区| 亚洲精品国产高清久久伦理二区| 久久久综合视频| 日韩精品一区二区在线观看| 欧美影院一区二区| 久久精品三级| 亚洲一区三区在线观看| 亚洲狠狠婷婷| 一区精品久久| 亚洲特级毛片| 狠狠噜噜久久| 韩国自拍一区| 国产精品第十页| 欧美+日本+国产+在线a∨观看| 99在线精品免费| 成人av电影在线观看| 国产成人8x视频一区二区| 久草中文综合在线| 另类的小说在线视频另类成人小视频在线 | 国产v日产∨综合v精品视频| 韩国理伦片一区二区三区在线播放| 石原莉奈一区二区三区在线观看| 一区二区三区欧美日| 亚洲精品乱码久久久久久久久| 中文字幕五月欧美| 中文字幕永久在线不卡| 自拍偷在线精品自拍偷无码专区 | 国产成+人+日韩+欧美+亚洲| 国产xxx精品视频大全| 99免费精品视频| 欧美黄色一区二区| 国产一区自拍视频| 亚洲国产一区二区三区高清| 亚洲少妇一区| 久久伊人亚洲| 欧美日韩视频第一区| 正在播放亚洲一区| 欧美zozozo| 国产午夜精品久久久久久久 | 欧美日本一区二区三区四区| 欧美日韩国产综合一区二区三区| 欧美日韩综合在线| 91精品国产综合久久婷婷香蕉| 7777精品伊人久久久大香线蕉的| 91精品国产入口| 精品久久久久久无| 国产精品女上位| 亚洲一区免费在线观看| 日韩二区三区四区| 国产裸体歌舞团一区二区| 成人av资源在线观看| 欧美久久久久久久|