CountDownLatch可以应用于等待多个线程执行完毕后,再执行剩余逻辑,下面举例说明。
场景:程序启动后有三个初始化启动步骤,都是耗时操作,如果单线程顺序执行的话比较耗时,且各步骤的执行无关联,此时考虑多个线程同时进行初始化,但要保证程序业务逻辑的执行要在3个初始化完成之后,应用CountDownLatch可达到此效果,初始化CountDownLatch时构造函数传入3,每个线程执行完时CountDownLatch执行countDown方法,进行减1操作,这样当3个线程都执行完后,countDownLatch.await();后的代码才得以执行,达到效果(相当于在多线程环境下达到顺序执行的效果)。代码示例如下:
package current; import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(3); // 线程1:进行程序启动的准备步骤1 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); System.out.println("完成准备步骤1"); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); // 线程2:进行程序启动的准备步骤2 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(10000); System.out.println("完成准备步骤2"); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); // 线程3:进行程序启动的准备步骤3 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); System.out.println("完成准备步骤3"); countDownLatch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); System.out.println("开始程序启动的准备步骤"); try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("步骤全部准备完毕,进行业务处理"); } }
执行结果为:
开始程序启动的准备步骤
完成准备步骤1
完成准备步骤3
完成准备步骤2
步骤全部准备完毕,进行业务处理