• 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接口
    下一篇:读写锁

  • 相关阅读:
    java基础--日期--练习集锦
    java基础-数字与字符串-练习集锦
    java-多态-之疑惑
    java-接口与多态-
    java基础 -继承-练习集锦
    java基础-对象-练习集锦
    java基础--数组--练习集锦
    hibernate第二天
    jquery的一些笔记
    struts入门2
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443279.html
Copyright © 2020-2023  润新知