摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言今天我們講最后一個(gè)同步工具類這個(gè)比較簡(jiǎn)單就是讓兩個(gè)線程交換數(shù)據(jù)理論只有兩個(gè)方法而已而且兩個(gè)還是一樣的只是參數(shù)不通而已跟另外一個(gè)線程交換數(shù)據(jù)如果另外一個(gè)線程的數(shù)據(jù)準(zhǔn)備好那么
引言本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載
今天我們講最后一個(gè)同步工具類Exchanger,這個(gè)比較簡(jiǎn)單,就是讓兩個(gè)線程交換數(shù)據(jù).
理論Exchanger只有兩個(gè)方法而已,而且兩個(gè)還是一樣的,只是參數(shù)不通而已
exchange(V x) 跟另外一個(gè)線程交換數(shù)據(jù)x,如果另外一個(gè)線程的數(shù)據(jù)準(zhǔn)備好,那么當(dāng)前線程會(huì)立刻返回,并獲得另外一個(gè)線程的數(shù)據(jù);否則當(dāng)前線程會(huì)進(jìn)入等待狀態(tài)
V exchange(V x, long timeout, TimeUnit unit): 跟exchange,如果會(huì)有一個(gè)指定的超時(shí)時(shí)間,如果在等待時(shí)間超時(shí)了,而且還沒(méi)有收到對(duì)方的數(shù)據(jù)的話,則會(huì)拋出TimeoutException異常
例子 有耐心的山治和路飛看過(guò)海賊王的人都知道山治和路飛,山治是一個(gè)廚師,手藝那是杠杠的.路飛則是一個(gè)大胃王,超能吃.現(xiàn)在編寫一個(gè)程序,讓山治不斷給路飛做食物,而路飛不斷吃,吃完之后要對(duì)山治說(shuō)感謝.ok,開始編碼
先編寫一個(gè)Food食物類,這個(gè)比較簡(jiǎn)單,就是定義一些食物
public class Food { public final static String[] food = { "打邊爐","奶味蘆筍湯","糟片鴨","烤花攬桂魚","苦中作樂(lè)","七星丸","鴨黃豆腐","貝絲扒菜膽","脆炒南瓜絲","龍鳳雙腿", //省略部分代碼.... }; private static Random random = new Random(); public static String getRandomFood(){ return food[random.nextInt(food.length)]; } }
之后編寫山治做菜的類 ShanZhiRunnable
public class ShanZhiRunnable implements Runnable{ Exchangerexchanger; Random random = new Random(); public ShanZhiRunnable(Exchanger exchanger) { this.exchanger = exchanger; } @Override public void run() { while (true){ try { String food = Food.getRandomFood(); System.out.println("==>山治開始做 " + food); Thread.sleep(random.nextInt(500)); System.out.println("==>山治把 " + food + " 給做好了,給路飛送過(guò)去"); String exchange = exchanger.exchange(food); System.out.println("==>山治收到路飛的評(píng)語(yǔ):" + exchange); } catch (InterruptedException e) { e.printStackTrace(); } } } }
然后編寫路飛吃飯的類 LuFeiRunnable
public class LuFeiRunnable implements Runnable{ Exchangerexchanger; Random random = new Random(); public LuFeiRunnable(Exchanger exchanger) { this.exchanger = exchanger; } @Override public void run() { String temp = "開吃啦..."; while (true){ try { String food = exchanger.exchange(temp); System.out.println("--->路飛拿到山治做的菜: " + food); Thread.sleep(random.nextInt(500)); System.out.println("--->路飛吃完" + food); temp = food + "太好吃!太感謝山治了..."; } catch (InterruptedException e) { e.printStackTrace(); } } } }
最后編寫測(cè)試類 TestMain
public class TestMain { public static void main(String[] args) { Exchangerexchanger = new Exchanger<>(); new Thread(new LuFeiRunnable(exchanger)).start(); new Thread(new ShanZhiRunnable(exchanger)).start(); } }
運(yùn)行結(jié)果如下,并截取部分輸出
==>山治開始做 一品鮑魚 ==>山治把 一品鮑魚 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):開吃啦... ==>山治開始做 芝麻肉絲 --->路飛拿到山治做的菜: 一品鮑魚 ==>山治把 芝麻肉絲 給做好了,給路飛送過(guò)去 --->路飛吃完一品鮑魚 --->路飛拿到山治做的菜: 芝麻肉絲 ==>山治收到路飛的評(píng)語(yǔ):一品鮑魚太好吃!太感謝山治了... ==>山治開始做 雞蛋炒西紅柿 --->路飛吃完芝麻肉絲 ==>山治把 雞蛋炒西紅柿 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):芝麻肉絲太好吃!太感謝山治了... --->路飛拿到山治做的菜: 雞蛋炒西紅柿 ==>山治開始做 油豆腐鑲?cè)?==>山治把 油豆腐鑲?cè)?給做好了,給路飛送過(guò)去 --->路飛吃完雞蛋炒西紅柿 --->路飛拿到山治做的菜: 油豆腐鑲?cè)?==>山治收到路飛的評(píng)語(yǔ):雞蛋炒西紅柿太好吃!太感謝山治了... ==>山治開始做 梅菜蒸魚尾 ==>山治把 梅菜蒸魚尾 給做好了,給路飛送過(guò)去 --->路飛吃完油豆腐鑲?cè)?==>山治收到路飛的評(píng)語(yǔ):油豆腐鑲?cè)馓贸?太感謝山治了... ==>山治開始做 炸子雞 --->路飛拿到山治做的菜: 梅菜蒸魚尾 ==>山治把 炸子雞 給做好了,給路飛送過(guò)去 --->路飛吃完梅菜蒸魚尾 --->路飛拿到山治做的菜: 炸子雞 ==>山治收到路飛的評(píng)語(yǔ):梅菜蒸魚尾太好吃!太感謝山治了... ==>山治開始做 翠竹粉蒸魚 ==>山治把 翠竹粉蒸魚 給做好了,給路飛送過(guò)去 --->路飛吃完炸子雞 --->路飛拿到山治做的菜: 翠竹粉蒸魚 ==>山治收到路飛的評(píng)語(yǔ):炸子雞太好吃!太感謝山治了... ==>山治開始做 風(fēng)情羊柳 ==>山治把 風(fēng)情羊柳 給做好了,給路飛送過(guò)去例子2 沒(méi)耐心的山治和路飛
現(xiàn)在假設(shè)他們倆都沒(méi)有耐心,不想一直等一下
將LuFeiRunnable修改為:
public class LuFeiRunnable implements Runnable{ Exchangerexchanger; Random random = new Random(); public LuFeiRunnable(Exchanger exchanger) { this.exchanger = exchanger; } @Override public void run() { String temp = "開吃啦..."; while (true){ try { String food = exchanger.exchange(temp, 300, TimeUnit.MILLISECONDS); System.out.println("--->路飛吃完" + food); temp = food + "太好吃!太感謝山治了..."; Thread.sleep(random.nextInt(500)); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException e) { System.out.println("--->路飛等的不耐煩了,不想等......開始喝起 東北風(fēng)" ); } } } }
將ShanZhiRunnable修改為
public class ShanZhiRunnable implements Runnable{ Exchangerexchanger; Random random = new Random(); public ShanZhiRunnable(Exchanger exchanger) { this.exchanger = exchanger; } @Override public void run() { while (true){ String food = Food.getRandomFood(); try { System.out.println("==>山治開始做 " + food); Thread.sleep(random.nextInt(500)); System.out.println("==>山治把 " + food + " 給做好了,給路飛送過(guò)去"); String exchange = exchanger.exchange(food, 300, TimeUnit.MILLISECONDS); System.out.println("==>山治收到路飛的評(píng)語(yǔ):" + exchange); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException e) { System.out.println("==>山治等的不耐煩了,不想等......,把 " + food + " 其他船員吃了"); } } } }
運(yùn)行一下程序:
==>山治開始做 辣子肉丁 --->路飛等的不耐煩了,不想等......開始喝起 東北風(fēng) ==>山治把 辣子肉丁 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):開吃啦... ==>山治開始做 砂鍋三味 --->路飛吃完辣子肉丁 ==>山治把 砂鍋三味 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):辣子肉丁太好吃!太感謝山治了... --->路飛吃完砂鍋三味 ==>山治開始做 甜椒肉絲 ==>山治把 甜椒肉絲 給做好了,給路飛送過(guò)去 --->路飛吃完甜椒肉絲 ==>山治收到路飛的評(píng)語(yǔ):砂鍋三味太好吃!太感謝山治了... ==>山治開始做 一品鮑魚 ==>山治把 一品鮑魚 給做好了,給路飛送過(guò)去 ==>山治等的不耐煩了,不想等......,把 一品鮑魚 其他船員吃了 ==>山治開始做 香酥鳳腿 --->路飛等的不耐煩了,不想等......開始喝起 東北風(fēng) ==>山治把 香酥鳳腿 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):甜椒肉絲太好吃!太感謝山治了... --->路飛吃完香酥鳳腿 ==>山治開始做 雪花片湯 ==>山治把 雪花片湯 給做好了,給路飛送過(guò)去 --->路飛吃完雪花片湯 ==>山治收到路飛的評(píng)語(yǔ):香酥鳳腿太好吃!太感謝山治了... ==>山治開始做 鳳尾金魚 ==>山治把 鳳尾金魚 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):雪花片湯太好吃!太感謝山治了... --->路飛吃完鳳尾金魚 ==>山治開始做 三菇浸魚云 --->路飛等的不耐煩了,不想等......開始喝起 東北風(fēng) ==>山治把 三菇浸魚云 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):鳳尾金魚太好吃!太感謝山治了... --->路飛吃完三菇浸魚云 ==>山治開始做 辣子雞丁 ==>山治把 辣子雞丁 給做好了,給路飛送過(guò)去 ==>山治收到路飛的評(píng)語(yǔ):三菇浸魚云太好吃!太感謝山治了... --->路飛吃完辣子雞丁 ==>山治開始做 梅干菜燒肉
通過(guò)以上兩個(gè)例子,掌握Exchanger應(yīng)該沒(méi)有什么難度.好的,這篇就到這里.
打賞如果覺(jué)得我的文章寫的還過(guò)得去的話,有錢就捧個(gè)錢場(chǎng),沒(méi)錢給我捧個(gè)人場(chǎng)(幫我點(diǎn)贊或推薦一下)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69925.html
摘要:倒計(jì)時(shí)鎖,線程中調(diào)用使進(jìn)程進(jìn)入阻塞狀態(tài),當(dāng)達(dá)成指定次數(shù)后通過(guò)繼續(xù)執(zhí)行每個(gè)線程中剩余的內(nèi)容。實(shí)現(xiàn)分階段的的功能測(cè)試代碼拿客網(wǎng)站群三產(chǎn)創(chuàng)建于年月日。 同步器 為每種特定的同步問(wèn)題提供了解決方案 Semaphore Semaphore【信號(hào)標(biāo);旗語(yǔ)】,通過(guò)計(jì)數(shù)器控制對(duì)共享資源的訪問(wèn)。 測(cè)試類: package concurrent; import concurrent.th...
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言做的同學(xué)們或多或少的接觸過(guò)集合框架在集合框架中大多的集合類是線程不安全的比如我們常用的等等我們寫一個(gè)例子看為什么說(shuō)是不安全的例子證明是線程不安全的我們開啟個(gè)線程每個(gè)線程向 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...
摘要:整個(gè)包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見(jiàn)的多線程設(shè)計(jì)模式,設(shè)計(jì)了并發(fā)包,其中包下提供了一系列基礎(chǔ)的鎖工具,用以對(duì)等進(jìn)行補(bǔ)充增強(qiáng)。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...
摘要:使用一個(gè)交換兩個(gè)線程的數(shù)據(jù),交換期間該會(huì)被鎖住,一般用于通信領(lǐng)域。當(dāng)雙方完成交換后,交換的就為的返回值。必須指定返回值的,否則該生產(chǎn)者生產(chǎn)的將不會(huì)與消費(fèi)者的空進(jìn)行交換。 Exchanger 使用一個(gè)pipeline交換兩個(gè)線程的數(shù)據(jù),交換期間該Slot會(huì)被鎖住,一般用于通信領(lǐng)域。 該類提供兩個(gè)方法 // k為交換對(duì)象 exchange(V k) //指定超時(shí)時(shí)間 e...
摘要:作用用來(lái)交換兩個(gè)線程的數(shù)據(jù)。示例運(yùn)行結(jié)果如下首先,會(huì)經(jīng)過(guò)三秒后,才輸出結(jié)果,說(shuō)明兩個(gè)線程沒(méi)交換之前是阻塞的。 作用 用來(lái)交換兩個(gè)線程的數(shù)據(jù)。 示例 public class ExchangerDemo { static Exchanger exchanger = new Exchanger(); static class Thread1 extends Thread ...
閱讀 2572·2021-11-23 09:51
閱讀 3366·2021-11-22 15:22
閱讀 1880·2021-11-18 13:22
閱讀 2277·2021-09-24 09:48
閱讀 1321·2019-08-29 13:58
閱讀 1316·2019-08-26 13:39
閱讀 2455·2019-08-26 10:48
閱讀 3042·2019-08-26 10:21