(資料圖片)
CountDownLatch是在Java多線(xiàn)程協(xié)作等待中最為常用的一個(gè)程序類(lèi),在本課程中將為讀者講解該類(lèi)的主要特點(diǎn),并通過(guò)具體的Java并發(fā)編程案例進(jìn)行開(kāi)發(fā)演示。
CountDownLatch是一種基于倒計(jì)數(shù)同步的線(xiàn)程管理機(jī)制,例如:咱們跟團(tuán)出去旅游的時(shí)候,一般都會(huì)對(duì)未歸隊(duì)的人員進(jìn)行一個(gè)統(tǒng)計(jì),每當(dāng)歸隊(duì)一位,就進(jìn)行計(jì)數(shù)的減少,一直到計(jì)數(shù)為0的時(shí)候才進(jìn)行后續(xù)的活動(dòng)。
例如:現(xiàn)在在主線(xiàn)程里面創(chuàng)建了三個(gè)子線(xiàn)程,而后主線(xiàn)程必須在這三個(gè)子線(xiàn)程全部執(zhí)行完成之后再繼續(xù)向下執(zhí)行,所以此時(shí)就可以基于一個(gè)CountDownLatch設(shè)置等待的線(xiàn)程數(shù)量為3,每當(dāng)一個(gè)子線(xiàn)程執(zhí)行完畢后就進(jìn)行一個(gè)計(jì)數(shù)的減1操作。
范例:使用CountDownLatche實(shí)現(xiàn)計(jì)數(shù)同步
package com.yootk;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;public class YootkDemo { // 李興華編程訓(xùn)練營(yíng)public static void main(String[] args) throws Exception { // 沐言yootkCountDownLatch latch = new CountDownLatch(3); // 總共的等待的數(shù)量為3for (int x = ; x < 3; x++) {new Thread(()->{try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.printf("【%s】到達(dá),并且已上車(chē)%n", Thread.currentThread().getName());latch.countDown(); // 減1},"游客 - " + x).start();}latch.await(); // 等待計(jì)數(shù)為后再解除阻塞System.out.println("【主線(xiàn)程】所有的旅客都到齊了,開(kāi)車(chē)走人,去下一個(gè)景點(diǎn)購(gòu)物消費(fèi)。");} }
需要注意的是,由于CountDownLatch沒(méi)有所謂的公平與非公平的機(jī)制,所以其內(nèi)部只是創(chuàng)建了一個(gè)Sync子類(lèi),所以在該類(lèi)的構(gòu)造方法之中僅僅只是提供了一個(gè)Sync(AQS子類(lèi))對(duì)象實(shí)例化。
public CountDownLatch(int count) {if (count < ) throw new IllegalArgumentException("count < 0");this.sync = new Sync(count); }
Copyright @ 2015-2022 華中晚報(bào)網(wǎng)版權(quán)所有 備案號(hào): 京ICP備12018864號(hào)-26 聯(lián)系郵箱:2 913 236 @qq.com