網站首頁 編程語言 正文
在分布式項目中,通過分布式架構實現相關功能調用,這是必然存在的。我在項目中,比如商品詳情信息頁面的展示,分享圖的合成等場景,都會涉及到好幾個分模塊功能獲取信息。CountdownLatch則可以很好的實現類似場景的功能實現。
CountdownLatch基本介紹
能夠使一個線程等待其他線程完成各自的工作之后再執行。
詳情:并發編程CountdownLatch && CyclicBarrier
場景介紹
結合actor和course信息合成一張分享圖,只介紹流程,核心代碼模擬。
代碼實現
public class CountDownLatchService {
protected Actor actor;
protected Course course;
protected CountDownLatchService(Actor actor, Course course) {
this.actor = actor;
this.course = course;
}
private static final int threadSize = 5;
private boolean isRunning = false;
private static final CountDownLatch latch = new CountDownLatch(2);
private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(
threadSize + 1,
threadSize + 1,
10,
TimeUnit.SECONDS
, new SynchronousQueue<>());
public int init() {
if (isRunning == true) {
System.out.println("線程正在運行...");
return -1;
}
isRunning = true;
executor.execute(() -> {
System.out.println("獲取actor相關信息");
course.setName("霍霍的courseName");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("1:"+latch.getCount());
});
executor.execute(() -> {
System.out.println("獲取course的name");
actor.setName("霍霍的actorName");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("2:"+latch.getCount());
});
executor.execute(() -> {
System.out.println("獲取course的type");
//僅僅測試模擬,真實項目可能就是分布式相關任務調用
course.setType(1L);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
System.out.println("3:"+latch.getCount());
});
executor.execute(() -> {
System.out.println("等待所有信息返回=");
try {
System.out.println("value:"+latch.getCount());
latch.await();
//設置isRunning=false
isRunning = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("course info= " + course.getName());
System.out.println("actor info= " + actor.getName());
//執行額外的拼接合成邏輯
System.out.println("拼接圖片完成");
});
executor.shutdown();
System.out.println("信息返回結束");
return 0;
}
public static void main(String[] args) {
Actor actor = new Actor();
Course course = new Course();
CountDownLatchService countDownLatchService = new CountDownLatchService(actor, course);
countDownLatchService.init();
}
}
需要注意的點
CountDownLatch初始值需謹慎考慮,比如如上demo,我需要三個獲取信息的線程去執行,每次執行latch.countDown(),count就會減1.當count為0的時候,就會執行await。
想表達什么意思呢?
比如你初始值是2,執行了三個latch.countDown();
比如你初始值是4,執行了三個latch.countDown();
兩個結果肯定是不同的,你去看源碼就會發現,所有調用await方法的線程都會阻塞在 AQS 的阻塞隊列中,通過判定count是否為0來決定是否喚起。
原文鏈接:https://blog.csdn.net/huo065000/article/details/122879971
相關推薦
- 2024-02-26 Cannot execute binary file 之原因
- 2021-12-02 C++內存分布及用法_C 語言
- 2022-12-27 Golang中int,?int8,?int16,?int32,?int64和uint區別淺析_Gol
- 2022-10-22 C++11新增的包裝器詳解_C 語言
- 2022-05-27 Redis對批量數據實現分布式鎖的實現代碼_Redis
- 2022-05-13 c++ remove_reference
- 2023-07-14 express+mongoose實現無限級分類
- 2022-12-21 kubernetes?k8s?存儲動態掛載配置詳解_云其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支