常用的并发工具类

在 JDK1.5 后,推出了几个并发的工具类,位于 JUC(JAVA.util.concurrent)包下 。
CountDownLatchCountDownLatch 类是使一个线程等待其他线程各自执行完毕后再执行 。
类似于现实中某个活动需要等到全部人齐了才可以开始 。
实现原理:

  • 基于 AQS 的共享模式 。
从ReentrantLock的实现看AQS的原理及应用
  • 这个类是一个同步计数器,主要用于线程间的控制 。
  • 当 CountDownLatch 的 count 计数 > 0 时,本线程的 await() 会造成阻塞,直到 count 变为 0,开始执行本线程 。
package test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Test1 {    public static void main(String[] args) {        final CountDownLatch latch = new CountDownLatch(2);      // 计数器初始化为 2,要等两个线程执行完毕        System.out.println("主线程开始执行");        ExecutorService es1 = Executors.newSingleThreadExecutor();        es1.execute(new Runnable() {            @Override            public void run() {                try {                    Thread.sleep(3000);                    System.out.println("子线程:" + Thread.currentThread().getName() + "执行");                }catch (InterruptedException e){                    e.printStackTrace();                }                latch.countDown();    // 使计数器减一            }        });        ExecutorService es2 = Executors.newSingleThreadExecutor();        es2.execute(new Runnable() {            @Override            public void run() {                try {                    Thread.sleep(3000);                }catch (InterruptedException e){                    e.printStackTrace();                }                System.out.println("子线程:" + Thread.currentThread().getName() + "执行");                latch.countDown();            }        });        System.out.println("等待两个线程执行完毕");        try {            latch.await();       // 主线程挂起,等待两个线程执行完        }catch (InterruptedException e){            e.printStackTrace();        }        System.out.println("两个子线程都执行完毕,继续执行主线程");    }}主线程开始执行                      等待两个线程执行完毕                子线程:pool-2-thread-1执行         子线程:pool-1-thread-1执行      两个子线程都执行完毕,继续执行主线程


推荐阅读