zoukankan      html  css  js  c++  java
  • JUC三大常用辅助类

    JUC三大常用辅助类

    CountDownLatch

    image-20200803153421441

    // 计数器
    public class CountDownLatchDemo {
        public static void main(String[] args) throws InterruptedException {
            // 总数是6,必须要执行任务的时候,再使用!
            CountDownLatch countDownLatch = new CountDownLatch(6);
    
            for (int i = 1; i <=6 ; i++) {
                new Thread(()->{
                    System.out.println(Thread.currentThread().getName()+" Go out");
                    countDownLatch.countDown(); // 数量-1
                },String.valueOf(i)).start();
            }
    
            countDownLatch.await(); // 等待计数器归零,然后再向下执行
    
            System.out.println("Close Door");
    
        }
    }
    

    原理:

    countDownLatch.countDown(); // 数量-1

    countDownLatch.await(); // 等待计数器归零,然后再向下执行 每次有线程调用 countDown() 数量-1,假设计数器变为0,countDownLatch.await() 就会被唤醒,继续 执行!

    CyclicBarrier

    image-20200803154643144

    public class CyclicBarrierDemo {
        public static void main(String[] args) {
            /**
             * 集齐7颗龙珠召唤神龙
             */
            // 召唤龙珠的线程
            CyclicBarrier cyclicBarrier = new CyclicBarrier(8,()->{
                System.out.println("召唤神龙成功!");
            });
    
            for (int i = 1; i <=7 ; i++) {
                final int temp = i;
                // lambda能操作到 i 吗
                new Thread(()->{
                    System.out.println(Thread.currentThread().getName()+"收集"+temp+"个龙珠");
                    try {
                        cyclicBarrier.await(); // 等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
    
        }
    }
    

    Semaphore

    image-20200803163045206

    与操作系统中的信号量一样

    抢车位!
    6车---3个停车位置

    public class SemaphoreDemo {
        public static void main(String[] args) {
            // 线程数量:停车位! 限流!
            Semaphore semaphore = new Semaphore(3);
    
            for (int i = 1; i <=6 ; i++) {
                new Thread(()->{
                    // acquire() 得到
                    try {
                        semaphore.acquire();
                        System.out.println(Thread.currentThread().getName()+"抢到车位");
                        TimeUnit.SECONDS.sleep(2);
                        System.out.println(Thread.currentThread().getName()+"离开车位");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        semaphore.release(); // release() 释放
                    }
    
                },String.valueOf(i)).start();
            }
    
        }
    }
    

    原理:

    semaphore.acquire() 获得,假设如果已经满了,等待,等待被释放为止!

    semaphore.release() 释放,会将当前的信号量释放 + 1,然后唤醒等待的线程! 作用: 多个共享资源互斥的使用!并发限流,控制最大的线程数!

    视频参考https://www.bilibili.com/video/BV1B7411L7tE
    上一篇:Callable接口
    下一篇:读写锁

  • 相关阅读:
    Pentaho
    知识地图
    分享学习笔记本
    2015-7-1 记而随,随而记
    web 导出 csv
    vs2013 密钥
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    如何绘制业务流程图?
    总是保存下拉选项的第一个值
    mac 修改密码后 频繁输入钥匙串问题修复方法
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443279.html
Copyright © 2011-2022 走看看