1、CountDownLatch html
同步工具類,容許一個或多個線程等待,直到其餘的線程操做完成後在執行。java
如何工做:多線程
CountDownLatch是經過一個計數器來實現的,計數器的初始值爲線程的數量。每當一個線程完成了本身的任務後,計數器的值就會減1。當計數器值到達0時,它表示全部的線程已經完成了任務,而後在閉鎖上等待的線程就能夠恢復執行任務。併發
使用場景:iphone
1.實現最大的並行性:有時咱們想同時啓動多個線程,實現最大程度的並行性。例如,咱們想測試一個單例類。若是咱們建立一個初始計數爲1的CountDownLatch,並讓全部線程都在這個鎖上等待,那麼咱們能夠很輕鬆地完成測試。咱們只需調用 一次countDown()方法就可讓全部的等待線程同時恢復執行。工具
2.開始執行前等待n個線程完成各自任務:例如應用程序啓動類要確保在處理用戶請求前,全部N個外部系統已經啓動和運行了。測試
3。死鎖檢測:一個很是方便的使用場景是,你可使用n個線程訪問共享資源,在每次測試階段的線程數目是不一樣的,並嘗試產生死鎖。this
2、使用countdownlach 和ExecutorService 線程池 編寫併發spa
countdownlach 同步計數設置爲1,countDown 則線程併發.net
package com.cyd.util.netty; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * countdownlach 和線程池完成併發 應用場景:一、最大併發。二、執行前等待N線程執行完成。 三、模擬鎖死。 * * @author chenyd 2017年11月29日 */ public class Concurrent { public static void main(String[] args) { int threadNum = 5; CountDownLatch countd = new CountDownLatch(1);// 同步線程數 ExecutorService threadPool = Executors.newFixedThreadPool(threadNum);// 線程池 for (int i = 0; i < threadNum; i++) { threadPool.execute(new ChildThread(i,countd)); } try { System.out.println("等待添加...."); Thread.sleep(1000); System.out.println("併發...."); countd.countDown(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { threadPool.shutdown(); // 關閉線程池,中止全部正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。 // threadPool.shutdownNow(); } } } class ChildThread implements Runnable { private int num; private CountDownLatch countd; public ChildThread(){}; public ChildThread(int num,CountDownLatch countd) { this.num = num; this.countd=countd; }; public void run() { try { countd.await(); // 使當前線程在鎖存器倒計數至零以前一直等待,除非線程被中斷或超出了指定的等待時間。 // latch.await(long timeout, TimeUnit unit); System.out.println("子線程:" + num); Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } finally { //當前計算工做結束,計數器減一 try { //Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); } //執行coutDown()以後,繼續執行本身的工做,不受主線程的影響 System.out.println("子線程"+num+"繼續執行,不受影響"); } } }
參考連接:
何時使用CountDownLatchhttp://www.importnew.com/15731.html
java多線程CountDownLatch及線程池ThreadPoolExecutor/ExecutorService使用示例http://blog.csdn.net/javaloveiphone/article/details/54729821