本文共 3533 字,大约阅读时间需要 11 分钟。
CountDownLatch用来同步一个或多个 任务,强制他们等待由其他任务执行的一组操作完成。
用法:
给CountDownLatch对象设置一个初值,任何在这个对象上调用await()的方法都将阻塞,等待这个计数值为0,
可以由其他线程在这个对象调用countDown()来减少这个计数值,计数值不能被重置。
countDown()不会造成阻塞。
示例:
/** * 完成初始化工作的对象 */class TaskPortion implements Runnable{ private static int counter=0; private final int id=counter++; private static Random rand=new Random(47); private final CountDownLatch latch; TaskPortion(CountDownLatch latch){ this.latch=latch; } @Override public void run() { try { doWork(); latch.countDown();//减少计数值 } catch (InterruptedException e) { } } public void doWork() throws InterruptedException{ TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));//随机等待一段时间,模拟任务进行 System.out.println(this+"completed"); } public String toString(){ return String.format("%1$-3d ",id); }}/** * 等待任务,必须等所有初始化任务完成之后才可以进行 */class WaitingTask implements Runnable{ private static int counter=0; private final int id=counter++; private final CountDownLatch latch; WaitingTask(CountDownLatch latch){ this.latch=latch; } @Override public void run() { try { latch.await();//使当前任务等待,直到计数值为0 System.out.println("Latch barrier passed for "+this); } catch (InterruptedException e) { System.out.println(this+" interrupted"); } } public String toString(){ return String.format("WaitingTask %1$-3d",id); }}public class CountDownLatchDemo { static final int SIZE=100; public static void main(String[] args) throws Exception{ ExecutorService exec= Executors.newCachedThreadPool(); CountDownLatch latch=new CountDownLatch(SIZE);//初始化计数值为100 for(int i=0;i<10;i++) exec.execute(new WaitingTask(latch));//10个等待任务 for(int i=0;iLaunched all tasks 43 completed 98 completed 37 completed 96 completed 94 completed 11 completed 21 completed 77 completed 6 completed 9 completed 75 completed 79 completed 10 completed 40 completed 95 completed 64 completed 23 completed 34 completed 29 completed 38 completed 55 completed 90 completed 88 completed 28 completed 4 completed 50 completed 8 completed 12 completed 0 completed 27 completed 99 completed 13 completed 72 completed 71 completed 45 completed 2 completed 91 completed 31 completed 14 completed 17 completed 7 completed 97 completed 35 completed 69 completed 20 completed 32 completed 5 completed 68 completed 36 completed 47 completed 87 completed 70 completed 84 completed 86 completed 66 completed 54 completed 42 completed 41 completed 46 completed 74 completed 57 completed 65 completed 80 completed 1 completed 19 completed 59 completed 15 completed 89 completed 51 completed 25 completed 53 completed 62 completed 58 completed 92 completed 76 completed 22 completed 56 completed 18 completed 85 completed 61 completed 30 completed 60 completed 67 completed 24 completed 26 completed 48 completed 39 completed 33 completed 52 completed 3 completed 93 completed 81 completed 78 completed 73 completed 44 completed 83 completed 49 completed 63 completed 82 completed 16 completed Latch barrier passed for WaitingTask 0 Latch barrier passed for WaitingTask 6 Latch barrier passed for WaitingTask 5 Latch barrier passed for WaitingTask 4 Latch barrier passed for WaitingTask 1 Latch barrier passed for WaitingTask 3 Latch barrier passed for WaitingTask 2 Latch barrier passed for WaitingTask 7 Latch barrier passed for WaitingTask 8 Latch barrier passed for WaitingTask 9
转载地址:http://kojqi.baihongyu.com/