zoukankan      html  css  js  c++  java
  • 并发编程-concurrent指南-计数器CountDownLatch

    java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成。

    CountDownLatch 以一个给定的数量初始化。countDown() 每被调用一次,这一数量就减一。通过调用 await() 方法之一,线程可以阻塞等待这一数量到达零。

    利用它可以实现类似计数器的功能。

    比如有一个任务A,它要等待其他5个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

    举个例子:

    有五个工人在为老板干活,这个老板有一个习惯,就是当五个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:五个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,Worker代表工人,Boss代表老板

    import java.util.concurrent.CountDownLatch;
    
    public class Main {
        public static void main(String[] args) {
            CountDownLatch countDownLatch = new CountDownLatch(5);//五个工人
    
            //工人
            Worker worker1 = new Worker(countDownLatch);
            new Thread(worker1).start();
            Worker worker2 = new Worker(countDownLatch);
            new Thread(worker2).start();
            Worker worker3 = new Worker(countDownLatch);
            new Thread(worker3).start();
            Worker worker4= new Worker(countDownLatch);
            new Thread(worker4).start();
            Worker worker5 = new Worker(countDownLatch);
            new Thread(worker5).start();
    
            //老板
            Boss boss = new Boss(countDownLatch);
            new Thread(boss).start();
        }
    }
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 工人
     */
    public class Worker implements Runnable{
        private CountDownLatch countDownLatch;
        public Worker(CountDownLatch countDownLatch){
            this.countDownLatch = countDownLatch;
        }
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+",工人在干活。。。");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+",工人干活结束。。。");
            countDownLatch.countDown();
        }
    }
    import java.util.concurrent.CountDownLatch;
    
    /**
     * 老板
     */
    public class Boss implements Runnable{
        private CountDownLatch countDownLatch;
        public Boss(CountDownLatch countDownLatch){
            this.countDownLatch = countDownLatch;
        }
    
        @Override
        public void run() {
            System.out.println("老板等待所有工人干活完成。。");
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("所有工人干活完成,开始检查。。");
        }
    }

    结果:

    Thread-0,工人在干活。。。
    Thread-1,工人在干活。。。
    Thread-3,工人在干活。。。
    Thread-2,工人在干活。。。
    Thread-4,工人在干活。。。
    老板等待所有工人干活完成。。
    Thread-2,工人干活结束。。。
    Thread-3,工人干活结束。。。
    Thread-1,工人干活结束。。。
    Thread-4,工人干活结束。。。
    Thread-0,工人干活结束。。。
    所有工人干活完成,开始检查。。

    适用场景:

    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

    源码地址:https://github.com/qjm201000/concurrent_countDownLatch.git

  • 相关阅读:
    PHP Fatal error: Uncaught Error: Call to undefined function pcntl_fork().. 开启php pcntl扩展实现多进程
    php实现共享内存进程通信函数之_shm
    Centos下10000次循环测试php对Redis和共享内存(shm)读写效率
    php操作共享内存shmop类及简单使用测试(代码)
    作为phper既然了解共享内存函数shmop的使用方法,那么就必须要了解一下信号量是什么,以及信号量使用的代码案例
    php简单使用shmop函数创建共享内存减少服务器负载
    作为php了解一下共享内存的概念及优缺点
    给PHP开启shmop扩展实现共享内存
    Centos环境自写脚本查看使用php或nginx占用内存
    linux下查看和添加path环境变量
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10149560.html
Copyright © 2011-2022 走看看