Join的加强版CountDownLatch
CountDownLatch允許一個(gè)或多個(gè)線程等待其他線程完成操作。
假如有這樣一個(gè)需求:我們需要解析一個(gè)Excel里多個(gè)sheet的數(shù)據(jù),此時(shí)可以考慮使用多線程,每個(gè)線程解析一個(gè)sheet里的數(shù)據(jù),等到所有的sheet都解析完之后,程序需要提示解析完成。在這個(gè)需求中,要實(shí)現(xiàn)主線程等待所有線程完成sheet的解析操作,最簡單的做法是使用join()方法。
public class JoinCountDownLatchTest {public static void main(String[] args) throws InterruptedException {Thread parser1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("parser1 finish");}});Thread parser2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("parser2 finish");}});parser1.start();parser2.start();parser1.join();parser2.join();System.out.println("all parser finish");} } result: parser1 finish parser2 finish all parser finish 主線程會等待線程1和2運(yùn)行完成后再運(yùn)行。在JDK 1.5之后的并發(fā)包中提供的CountDownLatch也可以實(shí)現(xiàn)join的功能,并且比join的功能更多
CountDownLatch的構(gòu)造函數(shù)接收一個(gè)int類型的參數(shù)作為計(jì)數(shù)器,如果你想等待N個(gè)點(diǎn)完成,這里就傳入N。
當(dāng)我們調(diào)用CountDownLatch的countDown方法時(shí),N就會減1,CountDownLatch的await方法
會阻塞當(dāng)前線程,直到N變成零。由于countDown方法可以用在任何地方,所以這里說的N個(gè)點(diǎn),可以是N個(gè)線程,也可以是1個(gè)線程里的N個(gè)執(zhí)行步驟。用在多個(gè)線程時(shí),只需要把這個(gè)CountDownLatch的引用傳遞到線程里即可。如果有某個(gè)線程處理得比較慢,我們不可能讓主線程一直等待,所以可以使用另外一個(gè)帶指定時(shí)間的await方法——await(long time,TimeUnit unit),這個(gè)方法等待特定時(shí)間后,就會不再阻塞當(dāng)前線程。join也有類似的方法。
注意的是:計(jì)數(shù)器必須大于等于0,只是等于0時(shí)候,計(jì)數(shù)器就是零,調(diào)用await方法時(shí)不會
阻塞當(dāng)前線程。CountDownLatch不可能重新初始化或者修改CountDownLatch對象的內(nèi)部計(jì)數(shù)
器的值。
轉(zhuǎn)載于:https://www.cnblogs.com/keeya/p/9320981.html
總結(jié)
以上是生活随笔為你收集整理的Join的加强版CountDownLatch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm 设置 直接内存 大小
- 下一篇: 一个案例说出python的十余个语法知识