CountDownLatch

来源:互联网 发布:数据库设置主键的语句 编辑:程序博客网 时间:2024/06/09 20:35

      CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务

       CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。

/**    * Copyright © 2017 公司名称. All rights reserved. *  * @Title: CountDownLatchTest.java  * @Prject: thread * @Package: com.sun.test.countDownLatch  * @Description: TODO * @author: sunqz    * @date: 2017年5月30日 下午9:07:40  * @version: V1.0    */package com.sun.test.countDownLatch;import java.util.concurrent.CountDownLatch;/**  * @ClassName: CountDownLatchTest  * @Description: countdownLatch测试 * @author: sunqz * @date: 2017年5月30日 下午9:07:40   */public class CountDownLatchTest {private static CountDownLatch countDownLatch= new CountDownLatch(1);public static void main(String[] args) {Thread work = new Thread(new WorkThread()); work.start();Thread init = new Thread(new InitThread());init.start();}/** *  * @ClassName: InitThread  * @Description: 模拟初始化线程 * @author: sunqz * @date: 2017年5月30日 下午9:11:38 */public static class InitThread implements Runnable{/* (non Javadoc)  * @Title: run * @Description: TODO  * @see java.lang.Runnable#run()  */@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("do init!");try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}countDownLatch.countDown();}}/** *  * @ClassName: WorkThread  * @Description: 模拟工作线程,工作之前必须先由初始化线程初始化完毕,工作线程才可以工作 * @author: sunqz * @date: 2017年5月30日 下午9:11:44 */public static class WorkThread implements Runnable{/* (non Javadoc)  * @Title: run * @Description: TODO  * @see java.lang.Runnable#run()  */@Overridepublic void run() {// TODO Auto-generated method stubtry {countDownLatch.await(); //阻塞等待初始化线程初始化完毕才开始工作System.out.println("do work !");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} //}}}


运行上述程序,我们可以发现work线程会阻塞等待init线程工作完毕才执行。

运行结果:

do init!
do work !



原创粉丝点击