CountDownLatch 和 CyclicBarrier 的用法

CountDownLatch

做用:是一組線程等待其餘的線程完成工做之後在執行,增強版joinjava

await 用來等待,countDown 負責計數器的減一app

public class UseCountDownLatch {
	
	static CountDownLatch latch = new CountDownLatch(6);

    /** * 初始化線程(只有一步,有4個) */
    private static class InitThread implements Runnable{

        @Override
        public void run() {
            System.out.println("Thread_" + Thread.currentThread().getId() + " ready init work......");
            //初始化線程完成工做了,countDown方法只扣減一次;
        	latch.countDown();
            for(int i =0;i<2;i++) {
            	System.out.println("Thread_"+Thread.currentThread().getId() +" ........continue do its work");
            }
        }
    }
    
    //業務線程
    private static class BusiThread implements Runnable{

        @Override
        public void run() {
        	try {
				latch.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
            for(int i =0;i<3;i++) {
            	System.out.println("BusiThread_"+Thread.currentThread().getId()
            			+" do business-----");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new Thread(new BusiThread()).start();
        for(int i=0;i<=3;i++){
            Thread thread = new Thread(new InitThread());
            thread.start();
        }

        latch.await();
        System.out.println("Main done its work........");
    }
}

複製代碼

CyclicBarrier

讓一組線程達到某個屏障,被阻塞,一直到組內最後一個線程達到屏障時,屏障開放,全部被阻塞的線程會繼續運行dom

CyclicBarrier(int parties) CyclicBarrier(int parties, Runnable barrierAction),屏障開放,barrierAction 定義的任務會執行ide

public class UseCyclicBarrier {
	
	private static CyclicBarrier barrier = new CyclicBarrier(5,new CollectThread());

    /** * 存放子線程工做結果的容器 */
    private static ConcurrentHashMap<String,Long> resultMap = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        for(int i=0;i<=4;i++){
            Thread thread = new Thread(new SubThread());
            thread.start();
        }

    }

    /** * 負責屏障開放之後的工做 */
    private static class CollectThread implements Runnable{

        @Override
        public void run() {
            StringBuilder result = new StringBuilder();
            for(Map.Entry<String,Long> workResult:resultMap.entrySet()){
            	result.append("[").append(workResult.getValue()).append("]");
            }
            System.out.println(" the result = "+ result);
            System.out.println("do other business........");
        }
    }

    /** * 工做線程 */
    private static class SubThread implements Runnable{

        @Override
        public void run() {
        	long id = Thread.currentThread().getId();
            resultMap.put(Thread.currentThread().getId() + "", id);
            //隨機決定工做線程的是否睡眠
            Random r = new Random();
            try {
                if(r.nextBoolean()) {
                	Thread.sleep(2000+id);
                	System.out.println("Thread_"+id+" ....do something ");
                }
                System.out.println(id+"....is await");
                barrier.await();
            	Thread.sleep(1000+id);
                System.out.println("Thread_"+id+" ....do its business ");
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}

複製代碼

CountDownLatch和CyclicBarrier辨析

  1. countdownlatch放行由第三者控制,CyclicBarrier放行由一組線程自己控制
  2. countdownlatch放行條件》=線程數,CyclicBarrier放行條件=線程數
相關文章
相關標籤/搜索