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