java CountDownLatch類的使用
CountDownLatch 是一個同步輔助類,猶如倒計時計數器,創建對象時通過構造方法設置初始值,調用CountDownLatch對象的await()方法則處于等待狀態,調用countDown()方法就將計數器減1,當計數到達0時,則所有等待者或單個等待者開始執行。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
以下舉例子說明用法:
1. 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("zhang san", 5000, latch); Worker worker2=new Worker("li si", 8000, latch); worker1.start();// worker2.start();// latch.await();//等待所有工人完成工作 System.out.println("all work done at "+sdf.format(new Date())); } 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(){ System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date())); doWork();//工作了 System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date())); latch.countDown();//工人完成工作,計數器減一 } private void doWork(){ try { Thread.sleep(workTime); } catch (InterruptedException e) { e.printStackTrace(); } } } }
輸出:
Worker zhang san do work begin at 2011-04-14 11:05:11
Worker li si do work begin at 2011-04-14 11:05:11
Worker zhang san do work complete at 2011-04-14 11:05:16
Worker li si do work complete at 2011-04-14 11:05:19
all work done at 2011-04-14 11:05:19
2.
package com.thread; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @author Administrator *該程序用來模擬發送命令與執行命令,主線程代表指揮官,新建3個線程代表戰士,戰士一直等待著指揮官下達命令, *若指揮官沒有下達命令,則戰士們都必須等待。一旦命令下達,戰士們都去執行自己的任務,指揮官處于等待狀態,戰士們任務執行完畢則報告給 *指揮官,指揮官則結束等待。 */ public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); //創建一個線程池 final CountDownLatch cdOrder = new CountDownLatch(1);//指揮官的命令,設置為1,指揮官一下達命令,則cutDown,變為0,戰士們執行任務 final CountDownLatch cdAnswer = new CountDownLatch(3);//因為有三個戰士,所以初始值為3,每一個戰士執行任務完畢則cutDown一次,當三個都執行完畢,變為0,則 指揮官停止等待。 for(int i=0;i<3;i++){ Runnable runnable = new Runnable(){ public void run(){ try { System.out.println("線程" + Thread.currentThread().getName() + "正準備接受命令"); cdOrder.await(); //戰士們都處于等待命令狀態 System.out.println("線程" + Thread.currentThread().getName() + "已接受命令"); Thread.sleep((long)(Math.random()*10000)); System.out.println("線程" + Thread.currentThread().getName() + "回應命令處理結果"); cdAnswer.countDown(); //任務執行完畢,返回給指揮官,cdAnswer減1。 } catch (Exception e) { e.printStackTrace(); } } }; service.execute(runnable);//為線程池添加任務 } try { Thread.sleep((long)(Math.random()*10000)); System.out.println("線程" + Thread.currentThread().getName() + "即將發布命令"); cdOrder.countDown(); //發送命令,cdOrder減1,處于等待的戰士們停止等待轉去執行任務。 System.out.println("線程" + Thread.currentThread().getName() + "已發送命令,正在等待結果"); cdAnswer.await(); //命令發送后指揮官處于等待狀態,一旦cdAnswer為0時停止等待繼續往下執行 System.out.println("線程" + Thread.currentThread().getName() + "已收到所有響應結果"); } catch (Exception e) { e.printStackTrace(); } service.shutdown(); //任務結束,停止線程池的所有線程 } }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!