摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言有一個同步助手可以讓一個或一些線程等待直到另外一些線程執(zhí)行完一些操作這就是理論在初始化的時候需要一個參數(shù)調(diào)用的線程會一直等待直到其他線程調(diào)用使清空為通常所有等待中的線程會
引言本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載
有一個同步助手,可以讓一個或一些線程等待直到另外一些線程執(zhí)行完一些操作.這就是CountDownLatch
理論CountDownLatch在初始化的時候需要一個count參數(shù).調(diào)用await()的線程會一直等待,直到其他線程調(diào)用countDown使count清空為0.通常所有等待中的線程會被釋放并且后面繼續(xù)調(diào)用await的線程會立即返回.這個是一次性操作,count不能被重置的.如果想要被重置的話,就可以參考(九)java多線程之CyclicBarrier
CountDownLatch(int count) 構(gòu)造一個指定count的CountDownLatch
await() 如果當(dāng)前的count為0的話,則會立即返回,否則當(dāng)前線程一直等待,直到以下情況至少發(fā)生一個
其他線程調(diào)用countDown使count清空為0
當(dāng)前線程被其他線程中斷
await(long timeout, TimeUnit unit) 如果當(dāng)前的count為0的話,則會立即返回,否則當(dāng)前線程一直等待,直到以下情況至少發(fā)生一個
其他線程調(diào)用countDown使count清空為0
當(dāng)前線程被其他線程中斷
指定的時間超時
countDown() 如果當(dāng)前的count大于0,則count減1,否則,所有等待的線程重新獲得執(zhí)行機(jī)會
例子我們還是用上一篇文章旅游做例子吧.小明,小剛,小紅","小麗,小黑,小白他們六個最后旅游回來時坐飛機(jī),飛機(jī)上就有空姐啦.那么等他們六個人下飛機(jī)之后,空姐就要考試清理垃圾啦,檢查設(shè)備等等,這些事情都必須飛機(jī)上的全部乘客下機(jī)之后才能做.行,按照這個場景,我們編寫一下程序吧.
首先,想定義一個飛機(jī)類 Airplane, 里面包含乘客下機(jī)和空姐的清理工作
public class Airplane { private CountDownLatch countDownLatch; private Random random; public Airplane(int peopleNum){ countDownLatch = new CountDownLatch(peopleNum); random = new Random(); } /** * 下機(jī) */ public void getOffPlane(){ try { String name = Thread.currentThread().getName(); Thread.sleep(random.nextInt(500)); System.out.println(name + " 在飛機(jī)在休息著...."); Thread.sleep(random.nextInt(500)); System.out.println(name + " 下飛機(jī)了"); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } public void doWork(){ try { String name = Thread.currentThread().getName(); System.out.println(name + "準(zhǔn)備做 清理 工作"); countDownLatch.await(); System.out.println("飛機(jī)的乘客都下機(jī)," + name + "可以開始做 清理 工作"); } catch (InterruptedException e) { e.printStackTrace(); } } }
最后,就可以直接寫測試類
public class TestMain { public static void main(String[] args) { String visitor = "明剛紅麗黑白"; String kongjie = "美惠花"; Airplane airplane = new Airplane(visitor.length()); Setthreads = new HashSet<>(); for (int i = 0; i < visitor.length(); i ++){ threads.add(new Thread(() -> { airplane.getOffPlane(); }, "小" + visitor.charAt(i))); } for (int i = 0; i < kongjie.length(); i ++){ threads.add(new Thread(() ->{ airplane.doWork(); }, "小" + kongjie.charAt(i) + "空姐")); } for (Thread thread : threads){ thread.start(); } } }
運(yùn)行一下結(jié)果:
小花空姐準(zhǔn)備做 清理 工作 小惠空姐準(zhǔn)備做 清理 工作 小美空姐準(zhǔn)備做 清理 工作 小麗 在飛機(jī)在休息著.... 小明 在飛機(jī)在休息著.... 小白 在飛機(jī)在休息著.... 小剛 在飛機(jī)在休息著.... 小剛 下飛機(jī)了 小明 下飛機(jī)了 小黑 在飛機(jī)在休息著.... 小麗 下飛機(jī)了 小紅 在飛機(jī)在休息著.... 小紅 下飛機(jī)了 小白 下飛機(jī)了 小黑 下飛機(jī)了 飛機(jī)的乘客都下機(jī),小花空姐可以開始做 清理 工作 飛機(jī)的乘客都下機(jī),小美空姐可以開始做 清理 工作 飛機(jī)的乘客都下機(jī),小惠空姐可以開始做 清理 工作
通過結(jié)果可以發(fā)現(xiàn),空姐都是等所有的乘客下飛機(jī)之后,才做清理工作的.結(jié)果正確,無毛病.
打賞如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點(diǎn)贊或推薦一下)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69913.html
摘要:多線程同步工具箱之篇前言的多線程協(xié)調(diào)工具,,,都是在多線程代碼中使用比較多的工具類之一。毫不夸張的說,這幾個類,是等同于解決多線程問的包,實在有必要添加到程序員的工具箱里面。 Java多線程同步工具箱之CountDownLatch篇 前言 Java的多線程協(xié)調(diào)工具CountDownLatch,Semaphore,CyclicBarrier,ReadWriteLock都是在多線程代碼中使...
摘要:線程可以調(diào)用的方法進(jìn)入阻塞,當(dāng)計數(shù)值降到時,所有之前調(diào)用阻塞的線程都會釋放。注意的初始計數(shù)值一旦降到,無法重置。 showImg(https://segmentfault.com/img/remote/1460000016012041); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、CountDownLatch簡介 CountDow...
摘要:好了,繼續(xù)向下執(zhí)行,嘗試獲取鎖失敗后,會調(diào)用首先通過方法,將包裝成共享結(jié)點(diǎn),插入等待隊列,插入完成后隊列結(jié)構(gòu)如下然后會進(jìn)入自旋操作,先嘗試獲取一次鎖,顯然此時是獲取失敗的主線程還未調(diào)用,同步狀態(tài)還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發(fā)于一世流云的專欄:https://segmentfa...
摘要:關(guān)于,最后有兩點(diǎn)規(guī)律需要注意當(dāng)?shù)牡却犃嘘犑捉Y(jié)點(diǎn)是共享結(jié)點(diǎn),說明當(dāng)前寫鎖被占用,當(dāng)寫鎖釋放時,會以傳播的方式喚醒頭結(jié)點(diǎn)之后緊鄰的各個共享結(jié)點(diǎn)。當(dāng)?shù)牡却犃嘘犑捉Y(jié)點(diǎn)是獨(dú)占結(jié)點(diǎn),說明當(dāng)前讀鎖被使用,當(dāng)讀鎖釋放歸零后,會喚醒隊首的獨(dú)占結(jié)點(diǎn)。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發(fā)于一世流云的專欄:...
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言講完了和今天講一個跟這兩個類有點(diǎn)類似的移相器中引入了一種新的可重復(fù)使用的同步屏障稱為移相器擁有與和類似的功勞但是這個類提供了更加靈活的應(yīng)用和都是只適用于固定數(shù)量的參與者 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github....
閱讀 665·2021-09-24 09:48
閱讀 2501·2021-08-26 14:14
閱讀 526·2019-08-30 13:08
閱讀 1455·2019-08-29 15:22
閱讀 3088·2019-08-29 11:06
閱讀 1013·2019-08-26 18:26
閱讀 1071·2019-08-26 13:53
閱讀 2546·2019-08-26 12:21