countDownLatch简介说明

戚薇 Java教程 发布时间:2023-05-18 21:57:02 阅读数:14685 1
下文笔者讲述countDownLatch简介说明,如下所示

countDownLatch简介

  countDownLatch在java1.5被引入
    跟它一起被引入的工具类
	还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue
  countDownLatch位于java.util.cucurrent包下 
 
countDownLatch类的功能:
    使一个线程等待其他线程各自执行完毕后再执行 

countDownLatch通过一个计数器来实现
   计数器的初始值是线程的数量
    每当一个线程执行完毕后,计数器的值就-1
    当计数器的值为0时,即所有线程都运行完毕
      此时在闭锁上等待的线程就可以恢复工作了。

countDownLatch类方法简介

countDownLatch类中只提供了一个构造器
   //参数count为计数值
   public CountDownLatch(int count) {  };  

类中最重要的三个方法:
	//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
	public void await() throws InterruptedException { };   
	//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
	public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  
	//将count值减1
	public void countDown() { };  
public class CountDownLatchTest {
 
    public static void main(String[] args) {
        final CountDownLatch latch = new CountDownLatch(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();
            }
        });
        es1.shutdown();
 
        //第二个子线程执行
        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();
            }
        });
        es2.shutdown();
        System.out.println("等待两个线程执行完毕…… ……");
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("两个子线程都执行完毕,继续执行主线程");
    }
}

----运行以上代码,将输出以下信息-----

主线程开始执行…… ……
等待两个线程执行完毕…… ……
子线程:pool-1-thread-1执行
子线程:pool-2-thread-1执行
两个子线程都执行完毕,继续执行主线程
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202305/6524.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者