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