摘要:今天我們來聊一聊的使用場景。使用場景在某些業務情況下,要求我們等某個條件或者任務完成后才可以繼續處理后續任務。同時在線程完成時也會觸發一定事件。方便業務繼續向下執行。第個毒販如果當前已經沒有可以毒販,立刻返回被干掉了干掉一個。
作者 : 畢來生前言
微信: 878799579
? 在 java.util.concurrent 包中提供了多種并發容器類來改進同步容器 的性能。今天我們來聊一聊CountDownLatch 的使用場景。看看它到底是怎么玩耍的。
CountDownLatch 是干什么的?? CountDownLatch 一個同步輔助類,在完成一組正在其他線程中執行的操作 之前,它允許一個或多個線程一直等待。
CountDownLatch原理? CountDownLatch是通過一個計數器來實現的,計數器的初始化值為線程的數量。每當一個線程完成了自己的任務后,計數器的值就相應得減1。當計數器到達0時,表示所有的線程都已完成任務,然后在閉鎖上等待的線程就可以恢復執行任務。
使用場景? 在某些業務情況下,要求我們等某個條件或者任務完成后才可以繼續處理后續任務。同時在線程完成時也會觸發一定事件。方便業務繼續向下執行。這個時候我們的CountDownLatch就隆重登場啦。常用核心方法為
/** * 遞減計數器的計數,如果計數達到0,則釋放所有等待的線程。 * 如果當前計數大于0,則將計數減少。 * 如果新的計數為0,會重啟所有等待線程 * 如果當前計數等于0,則不做任何操作 **/ public void countDown() { sync.releaseShared(1); } /** * 1、當前線程在倒數至0之前會一直等待 * 2、除非線程被中斷或超出了指定的時間。 * 3、如果當前計數為0,立刻返回為true * 4、如果當前計數等于0,則不做任何操作 * 5、如果當前線程在進入此方法時已經設置了該線程的中斷狀態, * 或者在等待時被中斷,則拋出InterruptedException **/ public boolean await(long timeout, TimeUnit unit) throws InterruptedException { return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); }實戰演練
package org.bilaisheng.juc; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @Author: bilaisheng * @Wechat: 878799579 * @Date: 2019/1/2 23:30 * @Todo: CountDownLatch demo。 * @Version : JDK11 , IDEA2018 */ public class CountDownLatchTest { // 舉個例子:有十個毒販在和警察激戰 public static void main(String[] args) throws InterruptedException { // 開始計數器 final CountDownLatch start = new CountDownLatch(1); // 結束計數器 final CountDownLatch end = new CountDownLatch(10); final ExecutorService executorService = Executors.newFixedThreadPool(10); for (int i = 1; i <= 10; i++) { // 這個變量純粹為了掩飾到底哪個倒霉先被干掉。 final String criminal = "第"+i+"個毒販"; Runnable task = new Runnable() { @Override public void run() { try { // 如果當前已經沒有可以毒販,立刻返回 start.await(); Thread.sleep(500); System.out.println(criminal + "被干掉了!"); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 干掉一個。毒販活著的數量就減1 end.countDown(); } } }; executorService.submit(task); } // 抓捕開始 start.countDown(); // 全都被干掉了(計數器為0) end.await(); // 任務完成:收工回家 executorService.shutdown(); } }
閉鎖可以延遲線程的進度直到其到達終止狀態,閉鎖可以用來確保某些活動直到其他活動都完成才繼續執行:
確保某個計算在其需要的所有資源都被初始化之后才繼續執行;
確保某個服務在其依賴的所有其他服務都已經啟動之后才啟動;
等待直到某個操作所有參與者都準備就緒再繼續執行。
喜歡就關注我吧文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75765.html
摘要:表示的是兩個,當其中任意一個計算完并發編程之是線程安全并且高效的,在并發編程中經常可見它的使用,在開始分析它的高并發實現機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯網高并發場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...
摘要:一導語最近在學習并發編程原理,所以準備整理一下自己學到的知識,先寫一篇的源碼分析,之后希望可以慢慢寫完整個并發編程。了解了的構造函數之后,我們再來看它的核心代碼,首先是。 一、導語 最近在學習并發編程原理,所以準備整理一下自己學到的知識,先寫一篇CountDownLatch的源碼分析,之后希望可以慢慢寫完整個并發編程。 二、什么是CountDownLatch CountDownLatc...
摘要:所以得出結論需要分配較多的線程進行讀數據,較少的線程進行寫數據。注意多線程編程對實際環境和需求有很大的依賴,需要根據實際的需求情況對各個參數做調整。 背景 最近對于 Java 多線程做了一段時間的學習,筆者一直認為,學習東西就是要應用到實際的業務需求中的。否則要么無法深入理解,要么硬生生地套用技術只是達到炫技的效果。 不過筆者仍舊認為自己對于多線程掌握不夠熟練,不敢輕易應用到生產代碼中...
閱讀 2302·2021-11-24 09:39
閱讀 2546·2021-11-22 15:24
閱讀 2985·2021-09-02 09:48
閱讀 3027·2021-07-26 22:01
閱讀 1443·2019-08-30 11:09
閱讀 1681·2019-08-29 18:47
閱讀 612·2019-08-29 15:40
閱讀 2139·2019-08-29 15:22