1.線程同步工具之CountDownLatch
CountDownLatch工作原理相對簡單,可以簡單看成一個倒計數器,在構造方法中指定初始值,每次調用countDown()方法時將計數器減1,而await()會等待計數器變為0。CountDownLatch關鍵接口如下
countDown() 如果當前計數器的值大于1,則將其減1;若當前值為1,則將其置為0并喚醒所有通過await等待的線程;若當前值為0,則什么也不做直接返回。await() 等待計數器的值為0,若計數器的值為0則該方法返回;若等待期間該線程被中斷,則拋出InterruptedException并清除該線程的中斷狀態。await(long timeout, TimeUnit unit) 在指定的時間內等待計數器的值為0,若在指定時間內計數器的值變為0,則該方法返回true;若指定時間內計數器的值仍未變為0,則返回false;若指定時間內計數器的值變為0之前當前線程被中斷,則拋出InterruptedException并清除該線程的中斷狀態。getCount() 讀取當前計數器的值,一般用于調試或者測試。構造方法參數指定了計數的次數
countDown方法,當前線程調用此方法,則計數減一
awaint方法,調用此方法會一直阻塞當前線程,直到計時器的值為0
-------------------------code----------------------------------------
import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo {final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(2);// 兩個工人的協作Worker worker1 = new Worker("張三", 1000, latch);Worker worker2 = new Worker("李四", 8000, latch);worker1.start();//worker2.start();//latch.await();// 等待所有工人完成工作System.out.PRintln("全部工作完成--> " + sdf.format(new Date()));System.out.println("計數器:"+latch.getCount());}static class Worker extends Thread {String workerName;int workTime;CountDownLatch latch;public Worker(String workerName, int workTime, CountDownLatch latch) {this.workerName = workerName;this.workTime = workTime;this.latch = latch;}public void run() {doWork();// 工作時間System.out.println(workerName + "--> 工作時間:" + sdf.format(new Date()));System.out.println("計數器:"+latch.getCount());latch.countDown();// 工人完成工作,計數器減一}private void doWork() {try {Thread.sleep(workTime);} catch (InterruptedException e) {e.printStackTrace();}}}}新聞熱點
疑難解答