Java并發(fā)多線程編程之CountDownLatch的用法
一、CountDownLatch概述
讓一些線程阻塞直到另外一些完成后才被喚醒。
CountDownLatch主要有兩個方法:
(1)、當(dāng)一個或多個線程調(diào)用await方法時,調(diào)用線程會被阻塞.
(2)、其他線程調(diào)用countDown方法計數(shù)器減1(調(diào)用countDown方法時線程不會阻塞),當(dāng)計數(shù)器的值變?yōu)?,因調(diào)用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行。
二、CountDownLatch代碼示例(模擬員工下班關(guān)門案例)
模擬公司所有員工都下班后,值班人員鎖門離開公司。
代碼
import java.util.concurrent.CountDownLatch;
/**
* @description: 模擬員工下班關(guān)門案例
* @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" + "忙完工作,下班。");
//計數(shù)器減1
countDownLatch.countDown();
},"員工編號:"+String.valueOf(i)).start();
}
//當(dāng)計數(shù)器的值變?yōu)?,因調(diào)用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "\t值班人員鎖門離開公司");
}
}輸出結(jié)果如下圖:

三、CountDownLatch代碼示例(使用枚舉方式模擬員工下班關(guān)門案例)
模擬公司所有員工都下班后,值班人員鎖門離開公司。
代碼
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" + "忙完工作,下班。");
//計數(shù)器減1
countDownLatch.countDown();
},EmpEnum.forEach(i).getName()).start();
}
//當(dāng)計數(shù)器的值變?yōu)?,因調(diào)用await方法被阻塞的線程會被喚醒,繼續(xù)執(zhí)行
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "\t值班人員鎖門離開公司");
}
}輸出結(jié)果如下圖:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring RedisTemplate 批量獲取值的2種方式小結(jié)
這篇文章主要介紹了Spring RedisTemplate 批量獲取值的2種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
Java list利用遍歷進(jìn)行刪除操作3種方法解析
這篇文章主要介紹了Java list利用遍歷進(jìn)行刪除操作3種方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式
這篇文章主要介紹了Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
SpringBoot項目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決
這篇文章主要介紹了SpringBoot項目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

