8.1 等待多線程完成的CountDownLatch
CountDownLatch允許一個(gè)或多個(gè)線程等待其他線程完成操作共屈。
CountDownLatch的構(gòu)造器接受一個(gè)int類(lèi)型的參數(shù)作為計(jì)數(shù)器细诸,如果你想等待N個(gè)點(diǎn)完成棺滞,這里就傳入N匀哄。
當(dāng)調(diào)用countDown()方法時(shí)大咱,N就會(huì)減1,CountDownLatch的await()方法會(huì)阻塞當(dāng)前線程咆霜,直到N變成0。
8.2 同步屏障CyclicBarrier
CyclicBarrier的字面意思是可循環(huán)使用的(Cyclic)的屏障(Barrier)嘶朱。讓一組線程到達(dá)一個(gè)屏障(也叫做同步點(diǎn))時(shí)被阻塞蛾坯,直到最后一個(gè)線程到達(dá)同步點(diǎn)才會(huì)開(kāi)門(mén),所有被阻塞的線程重新開(kāi)始運(yùn)行疏遏。
CyclicBarrier的默認(rèn)構(gòu)造器其參數(shù)表示屏障攔截的線程數(shù)量脉课,每個(gè)線程調(diào)用await方法告訴CyclicBarrier我已經(jīng)到達(dá)了屏障,然后線程被阻塞财异,知道最后一個(gè)線程到達(dá)時(shí)被喚醒倘零。
CyclicBarrier與CountDownLatch的區(qū)別:CountDownLatch的計(jì)數(shù)器只能使用一次,而CyclicBarrier的計(jì)數(shù)器可以使用reset()方法重置戳寸。所以CyclicBarrier可以處理更為復(fù)雜的業(yè)務(wù)場(chǎng)景呈驶。例如,如果計(jì)算發(fā)生錯(cuò)誤疫鹊,可以重置計(jì)數(shù)器袖瞻,并讓線程重新計(jì)算。
CyclicBarrier還提供了其他有用的方法订晌。例如getNumberWaiting()獲得被阻塞的線程的數(shù)量。isBoken()方法來(lái)了解被阻塞的線程是否被中斷蚌吸。
8.3 控制并發(fā)線程數(shù)的Semaphore
Semaphore(信號(hào)量)用來(lái)控制同時(shí)訪問(wèn)特定資源的線程數(shù)量锈拨,它通過(guò)協(xié)調(diào)各個(gè)線程,以保證合理的使用公共資源羹唠。
Semaphore可以用作流量控制奕枢,特別是公共資源有限的應(yīng)用場(chǎng)景。比如有一個(gè)需求佩微,要讀取幾萬(wàn)個(gè)文件的數(shù)據(jù)缝彬,因?yàn)槎际荌O密集型任務(wù),我們可以啟動(dòng)及時(shí)個(gè)線程并發(fā)的讀取哺眯。但是讀入內(nèi)存后谷浅,要存儲(chǔ)到數(shù)據(jù)庫(kù)中,而數(shù)據(jù)庫(kù)連接只有10個(gè)奶卓,這時(shí)我們必須控制只有10個(gè)線程可以同時(shí)獲取到數(shù)據(jù)庫(kù)連接保存數(shù)據(jù)一疯。
Semaphore還提供了一些其他方法:
(1)int availablePermits():返回此信號(hào)量中當(dāng)前可用的許可證數(shù)量。
(2)int getQueueLength():返回正在等待獲取許可證的線程數(shù)量夺姑。
8.4 線程間交換數(shù)據(jù)的Exchanger
Exchanger用于線程間的數(shù)據(jù)交換墩邀。它通過(guò)一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn)盏浙,兩個(gè)線程可以交換彼此的數(shù)據(jù)眉睹。這兩個(gè)線程通過(guò)exchange()方法交換數(shù)據(jù)荔茬,如果第一個(gè)線程先執(zhí)行exchange()方法,它會(huì)一直等待第二個(gè)線程也執(zhí)行exchange()方法竹海,當(dāng)兩個(gè)線程都到達(dá)同步點(diǎn)時(shí)慕蔚,這兩個(gè)線程 就可以交換數(shù)據(jù),將本線程生產(chǎn)出來(lái)的數(shù)據(jù)傳遞給對(duì)方站削。