赞
踩
1、CountDownLatch:同步计数器
当CountDownLatch的count计数>0时,await()会造成线程阻塞,当使用countDown()让count-- == 0时,线程结束阻塞。 如果想让其他线程执行完指定程序,其他所有程序都执行结束后再执行,这时可以用CountDownLatch,但计数无法被重置,如果需要重置计数,请考虑使用 CyclicBarrier。下面demo演示了当所有线程执行完任务后。
public class CountDownLatchDemo implements Runnable { private CountDownLatch begin; //观察end的count为0时,会使当前线程退出阻塞 private CountDownLatch end; //用来模拟子线程执行的任务 private int index = 10; public CountDownLatchDemo(CountDownLatch begin, CountDownLatch end) { this.begin = begin; this.end = end; } //这里要使用同步synchronized synchronized public void run(){ try { begin.await(); index--; System.out.println(Thread.currentThread().getName() + ":执行完任务了, index: " + index); } catch (Exception e) { e.printStackTrace(); } finally { end.countDown(); } } public static void main(String[] args) throws InterruptedException { CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(10); CountDownLatchDemo cdlDemo = new CountDownLatchDemo(begin, end); System.out.println("所有线程开始执行任务...."); for (int i = 0; i < 10; i++) { new Thread(cdlDemo).start(); } //开始让所有线程工作 begin.countDown(); // end.await(); System.out.println("所有线程完成任务,可以开始做其它想做的事 了...."); } }
2、CyclicBarrier: 线程屏障的功能
可以协同多个线程,让多个线程在这个屏障前等到,直到所有线程都到达了这个屏障时,再一起执行后面的操作。下面demo创建11个线程,前面每一个线程使用await()都会使当前线程阻塞,直到最后一个线程使用await()会使11个线程全部退出阻塞。
public class CyclicBarrierDemo implements Runnable { private CyclicBarrier cyclicBarrier; private int index ; public CyclicBarrierDemo(CyclicBarrier cyclicBarrier, int index) { this.cyclicBarrier = cyclicBarrier; this.index = index; } public void run() { try { System.out.println("index: " + index); index--; cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { CyclicBarrier cyclicBarrier = new CyclicBarrier(11); for (int i = 0; i < 10; i++) { new Thread(new CyclicBarrierDemo(cyclicBarrier, i)).start(); } cyclicBarrier.await(); System.out.println("全部到达屏障.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。