標籤:喚醒 out 線程 dom style print countdown cst ready
1.1. 倒數鎖CountDownLatch
CountDownLatch是另外一種線程同步工具。參與倒數的每個線程在工作完成後都執行countDown()方法,當所有線程都執行完後,會喚醒一個或多個在等待倒數計數為0的線程。
package com.test.concurrence; import java.util.Date;import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; public class CountDownLatchTest { public static void main(String[] args) { final CountDownLatch countDownLatch = new CountDownLatch(10);ExecutorService executorService = Executors.newFixedThreadPool(10);//建立10個倒數線程。for(int i=0;i<10;i++){executorService.submit(new Runnable(){ @Overridepublic void run() {try {Thread.sleep(1000* new Random().nextInt(20));} catch (InterruptedException e) {e.printStackTrace();}//每個參與倒數的線程都倒數1次,計數減1.countDownLatch.countDown();System.out.println("count:" + countDownLatch.getCount() + " , " + new Date()); } });}//建立3個等待倒數計數為0的線程。for(int i=0;i<3;i++){executorService.submit(new Runnable(){ @Overridepublic void run() {try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ready:" + countDownLatch.getCount() + " , " + new Date()); } });} executorService.shutdown(); } }
運行結果如下:
count:9 , Sat Mar 18 23:11:16 CST 2017
count:7 , Sat Mar 18 23:11:18 CST 2017
count:8 , Sat Mar 18 23:11:18 CST 2017
count:6 , Sat Mar 18 23:11:20 CST 2017
count:5 , Sat Mar 18 23:11:25 CST 2017
count:4 , Sat Mar 18 23:11:25 CST 2017
count:3 , Sat Mar 18 23:11:26 CST 2017
count:2 , Sat Mar 18 23:11:27 CST 2017
count:1 , Sat Mar 18 23:11:33 CST 2017
count:0 , Sat Mar 18 23:11:33 CST 2017
ready:0 , Sat Mar 18 23:11:33 CST 2017
ready:0 , Sat Mar 18 23:11:33 CST 2017
ready:0 , Sat Mar 18 23:11:33 CST 2017
Java並發程式設計(20)並發鎖之倒數鎖CountDownLatch