ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

55 JUC并发编程2

2021-04-25 22:03:31  阅读:197  来源: 互联网

标签:JUC 55 编程 System 计数器 线程 countDownLatch println out


JUC并发编程2

8、常用的辅助类

8.1、CountDownLatch

允许一个或多个线程等待直到其他线程中执行的一组操作完成同步辅助

计数器

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        //总数是6,必须要执行任务的时候,再执行!
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for (int i = 0; i <= 6 ; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"get out");
                countDownLatch.countDown();// 计数器-1
            },String.valueOf(i)).start();
        }

        countDownLatch.await();//等待计数器归零,然后再向下执行,需要抛出异常

        System.out.println("close door");

    }
}

原理:

countDownLatch.countDown();// 计数器-1

countDownLatch.await();//等待计数器归零,然后再向下执行

每次有线程调用countDownLatch.countDown();// 计数器-1,调用这个方法不会阻塞,假设计数器变为0,countDownLatch.await();就会被唤醒,继续执行

8.2、CyclicBarrier

允许一组线程全部等待彼此达到共同屏障点,同步辅助

加法计数器

public class CyclicBarrierDemo {

    public static void main(String[] args) {
        //集齐7颗龙珠召唤神龙

        //召唤龙珠的线程
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召唤神龙成功");
        });

        for (int i = 0; i <= 7; i++) {
            //加final,变量会存在堆中的方法区里,
            //子线程共享进程的堆,所以能读到。否则会存在另一个线程的栈中,不同线程读不到
           final int temp = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"收集了"+temp);
                try {
                    //通过await来计数,await之后本次线程会被阻塞,
                    // 直到神龙召唤后,才执行后面的
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }

    }
}

8.3、Semaphore

一个计数信号量,在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它

6个车 ----> 3个停车位

public class SemaphoreDemo {
    public static void main(String[] args) {
        //线程数量:停车位  限流
        Semaphore semaphore = new Semaphore(3);

        for (int i = 0; i <= 6; i++) {
            new Thread(()->{
                //acquire() 得到
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "抢到车位");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName() + "离开");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    //release() 释放
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}

原理:

semaphore.acquire();得到,假如已经满了,等待,等待被释放为止

semaphore.release(); 释放,会将当前的信号量 +1 然后唤醒等待的线程

作用:多个共享资源互斥的使用! 并发限流,控制最大的线程数

标签:JUC,55,编程,System,计数器,线程,countDownLatch,println,out
来源: https://www.cnblogs.com/flypigggg/p/14702232.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有