JUC之AQS_CountDownLatch

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ycd500756/article/details/81545683

CountDownLatch:闭锁
一个线程等待多个线程执行完。才继续自己的操作;可以使用闭锁来保证某些活动到其他活动做完才继续进行

应用
1. 确保计算机在其需要的所有资源被初始化之后才继续执行;
2. 确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
3. 等待直到某个操作所有参与者都准备就绪了继续操作。

demo1

package com.mark.example.aqs;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * author:Mark
 * date:2018/7/31  17:46
 */
@Slf4j
public class CountDownLatchTest1 {
    private final static int threadCount = 20;

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);//闭锁
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            executorService.execute(()->{
                try {
                    test(threadNum);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await();
        log.info("finish");
        executorService.shutdown();
    }

    private static void test(int threadNum) throws InterruptedException {
        Thread.sleep(100);
        log.info("{}", threadNum);
        Thread.sleep(100);
    }
}

运行结果

22:56:26.945 [pool-1-thread-19] INFO com.mark.example.aqs.CountDownLatchTest1 - 18
22:56:26.945 [pool-1-thread-8] INFO com.mark.example.aqs.CountDownLatchTest1 - 7
22:56:26.945 [pool-1-thread-12] INFO com.mark.example.aqs.CountDownLatchTest1 - 11
22:56:26.945 [pool-1-thread-9] INFO com.mark.example.aqs.CountDownLatchTest1 - 8
22:56:26.945 [pool-1-thread-15] INFO com.mark.example.aqs.CountDownLatchTest1 - 14
22:56:26.945 [pool-1-thread-13] INFO com.mark.example.aqs.CountDownLatchTest1 - 12
22:56:26.946 [pool-1-thread-1] INFO com.mark.example.aqs.CountDownLatchTest1 - 0
22:56:26.945 [pool-1-thread-10] INFO com.mark.example.aqs.CountDownLatchTest1 - 9
22:56:26.945 [pool-1-thread-18] INFO com.mark.example.aqs.CountDownLatchTest1 - 17
22:56:26.945 [pool-1-thread-11] INFO com.mark.example.aqs.CountDownLatchTest1 - 10
22:56:26.946 [pool-1-thread-3] INFO com.mark.example.aqs.CountDownLatchTest1 - 2
22:56:26.946 [pool-1-thread-17] INFO com.mark.example.aqs.CountDownLatchTest1 - 16
22:56:26.945 [pool-1-thread-2] INFO com.mark.example.aqs.CountDownLatchTest1 - 1
22:56:26.946 [pool-1-thread-20] INFO com.mark.example.aqs.CountDownLatchTest1 - 19
22:56:26.945 [pool-1-thread-14] INFO com.mark.example.aqs.CountDownLatchTest1 - 13
22:56:26.945 [pool-1-thread-7] INFO com.mark.example.aqs.CountDownLatchTest1 - 6
22:56:26.946 [pool-1-thread-6] INFO com.mark.example.aqs.CountDownLatchTest1 - 5
22:56:26.946 [pool-1-thread-16] INFO com.mark.example.aqs.CountDownLatchTest1 - 15
22:56:26.946 [pool-1-thread-4] INFO com.mark.example.aqs.CountDownLatchTest1 - 3
22:56:26.946 [pool-1-thread-5] INFO com.mark.example.aqs.CountDownLatchTest1 - 4
22:56:27.051 [main] INFO com.mark.example.aqs.CountDownLatchTest1 - finish


demo2

package com.mark.example.aqs;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * author:Mark
 * date:2018/7/31  17:46
 */
@Slf4j
public class CountDownLatchTest2 {
    private final static int threadCount = 10;

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);//闭锁
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            executorService.execute(()->{
                try {
                    test(threadNum);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await(20, TimeUnit.MILLISECONDS);//指定时间唤醒--》注意打印finish语句
        log.info("finish");
        executorService.shutdown();//不会立即停止线程池里的线程。而是等待线程池里的线程执行完再关闭线程池
    }

    private static void test(int threadNum) throws InterruptedException {
        Thread.sleep(10);
        log.info("{}", threadNum);
    }
}

运行结果:

23:01:28.254 [pool-1-thread-1] INFO com.mark.example.aqs.CountDownLatchTest2 - 0
23:01:28.254 [pool-1-thread-3] INFO com.mark.example.aqs.CountDownLatchTest2 - 2
23:01:28.254 [pool-1-thread-2] INFO com.mark.example.aqs.CountDownLatchTest2 - 1
23:01:28.263 [main] INFO com.mark.example.aqs.CountDownLatchTest2 - finish
23:01:28.269 [pool-1-thread-3] INFO com.mark.example.aqs.CountDownLatchTest2 - 4
23:01:28.269 [pool-1-thread-2] INFO com.mark.example.aqs.CountDownLatchTest2 - 5
23:01:28.269 [pool-1-thread-1] INFO com.mark.example.aqs.CountDownLatchTest2 - 3
23:01:28.280 [pool-1-thread-3] INFO com.mark.example.aqs.CountDownLatchTest2 - 6
23:01:28.280 [pool-1-thread-1] INFO com.mark.example.aqs.CountDownLatchTest2 - 8
23:01:28.280 [pool-1-thread-2] INFO com.mark.example.aqs.CountDownLatchTest2 - 7
23:01:28.291 [pool-1-thread-3] INFO com.mark.example.aqs.CountDownLatchTest2 - 9

猜你喜欢

转载自blog.csdn.net/ycd500756/article/details/81545683
今日推荐