Java并發(fā)多線程編程之CountDownLatch的用法
更新時間:2023年06月19日 10:18:36 作者:小志的博客
這篇文章主要介紹了Java并發(fā)多線程編程之CountDownLatch的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
一、CountDownLatch概述
讓一些線程阻塞直到另外一些完成后才被喚醒。
CountDownLatch主要有兩個方法:
(1)、當一個或多個線程調用await方法時,調用線程會被阻塞.
(2)、其他線程調用countDown方法計數器減1(調用countDown方法時線程不會阻塞),當計數器的值變?yōu)?,因調用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行。
二、CountDownLatch代碼示例(模擬員工下班關門案例)
模擬公司所有員工都下班后,值班人員鎖門離開公司。
代碼
import java.util.concurrent.CountDownLatch; /** * @description: 模擬員工下班關門案例 * @author: xz */ public class CountDownLatchDemo1 { public static void main(String[] args) throws InterruptedException { closeDoor(); } private static void closeDoor() throws InterruptedException { //創(chuàng)建CountDownLatch,初始容量為10,模擬10名員工 CountDownLatch countDownLatch=new CountDownLatch(10); for (int i=1;i<=10;i++){ new Thread(()->{ System.out.println(Thread.currentThread().getName() + "\t" + "忙完工作,下班。"); //計數器減1 countDownLatch.countDown(); },"員工編號:"+String.valueOf(i)).start(); } //當計數器的值變?yōu)?,因調用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行 countDownLatch.await(); System.out.println(Thread.currentThread().getName() + "\t值班人員鎖門離開公司"); } }
輸出結果如下圖:
三、CountDownLatch代碼示例(使用枚舉方式模擬員工下班關門案例)
模擬公司所有員工都下班后,值班人員鎖門離開公司。
代碼
import lombok.Getter; /** * @description: 枚舉類,定義10名員工 * @author: xz * */ public enum EmpEnum { ONE(1, "劉一"), TWO(2, "陳二"), THREE(3, "張三"), FOUR(4, "李四"), FIVE(5, "王五"), SIX(6, "趙六"), SEVEN(7, "孫七"), EIGHT(8, "周八"), NINE(9, "吳九"), TEN(10, "鄭十"); @Getter private int code;//員工編號 @Getter private String name;//員工名稱 EmpEnum(Integer code, String name) { this.code = code; this.name = name; } public static EmpEnum forEach(int index) { EmpEnum[] EmpEnums = EmpEnum.values(); for (EmpEnum epmEnum : EmpEnums) { if (index == epmEnum.getCode()) { return epmEnum; } } return null; } }
public class CountDownLatchDemo2 { public static void main(String[] args) throws InterruptedException { closeDoor(); } private static void closeDoor() throws InterruptedException { //創(chuàng)建CountDownLatch,初始容量為10,模擬10名員工 CountDownLatch countDownLatch=new CountDownLatch(10); for (int i=1;i<=10;i++){ new Thread(()->{ System.out.println(Thread.currentThread().getName() + "\t" + "忙完工作,下班。"); //計數器減1 countDownLatch.countDown(); },EmpEnum.forEach(i).getName()).start(); } //當計數器的值變?yōu)?,因調用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行 countDownLatch.await(); System.out.println(Thread.currentThread().getName() + "\t值班人員鎖門離開公司"); } }
輸出結果如下圖:
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring RedisTemplate 批量獲取值的2種方式小結
這篇文章主要介紹了Spring RedisTemplate 批量獲取值的2種方式小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Java中Arrays.sort自定義一維數組、二維數組的排序方式
這篇文章主要介紹了Java中Arrays.sort自定義一維數組、二維數組的排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08SpringBoot項目網頁加載出現Whitelabel?Error?Page的解決
這篇文章主要介紹了SpringBoot項目網頁加載出現Whitelabel?Error?Page的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11