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