我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java多线程JUC常用辅助类详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java多线程JUC常用辅助类详解

1.countDownLatch

减法计数器:实现调用几次线程后,在触发另一个任务

在这里插入图片描述

简单代码实现:

举例说明:就像五个人在同一房间里,有一个看门的大爷,当五个人都出去后,他才能锁门,也就是说 执行5次出门这个动作的线程后,才出发了锁门的这个动作


import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(5);
        System.out.println("door is open");
        for (int i = 1; i <= 5 ; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+" is going out");
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        countDownLatch.await();
        System.out.println("door is closed");
    }
}

代码运行结果:

在这里插入图片描述

基本原理:

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

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

每次有线程调用 countDown() 数量-1,假设计数器变为0,countDownLatch.await() 就会被唤醒,继续执行!

2.CyclicBarrier

在这里插入图片描述

在这里插入图片描述

这里我们简单理解为 加法计数器

简单代码实现:

举例说明:这里只要集齐7颗龙珠,就执行 打印 “7颗龙珠集齐了”的线程,这里我们先设置线程计数为8,看看会不会执行打印的线程,然后在执行计数为7的情况

1.cyclicBarrier计数为8的时候,执行线程数量为7的时候:


import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(8,new myThread());
        for (int i = 1; i <= 7 ; i++) {
            int finalI = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+"收集了"+ finalI+"颗龙珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }
}
class myThread implements Runnable{
    @Override
    public void run() {
        System.out.println("7颗龙珠集齐啦");
    }
}

执行结果:

在这里插入图片描述

2.cyclicBarrier计数为1的时候,执行线程数量为7的时候:


import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,new myThread());
        for (int i = 1; i <= 7 ; i++) {
            int finalI = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+"收集了"+ finalI+"颗龙珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }
}
class myThread implements Runnable{
    @Override
    public void run() {
        System.out.println("7颗龙珠集齐啦");
    }
}

执行结果:

在这里插入图片描述

可以看到


  CyclicBarrier cyclicBarrier = new CyclicBarrier(7,new myThread());

当执行完7个线程后,才会执行一个实现了Runnable接口的线程

3.Semaphore

在这里插入图片描述

简单代码实现:
举例说明:抢车位 ,6个车,最多同时只能有三个车进


import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreTest {
    public static void main(String[] args)  {
        //线程数量 ,停车位,,6辆车在等,最多只能同时进来三个 限流
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 6 ; i++) {
            new Thread(() -> {
                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 {
                    semaphore.release(); //释放
                }
            },String.valueOf(i)).start();
        }
    }
}

运行结果:

在这里插入图片描述

原理说明:

semaphore.acquire() ; 获得,假设如果已经满了,等待,等待被释放为止!
semaphore.release() ; 释放,会将当前的信号量释放 + 1,然后唤醒等待的线程!

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

以上就是java多线程JUC常用辅助类详解的详细内容,更多关于java多线程JUC辅助类的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java多线程JUC常用辅助类详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何深入理解Java多线程与并发框中的并发辅助工具类

如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线
2023-06-05

Java多线程Thread类的使用详解

这篇文章主要介绍了Java多线程Thread类的使用及注意事项,在java标准库中提供了一个Thread类来表示/操作线程,Thread类也可以视为是java标准库提供的API
2022-12-03

【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评
【Java系列】详解多线程(二)——Thread类及常见方法(上篇)
2023-12-23

详解Java中多线程异常捕获Runnable的实现

详解Java中多线程异常捕获Runnable的实现1、背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常。所以要实现主线程对子线程异常的捕获。2、工具: 实现Runnable接口的LayerIn
2023-05-31

详解Java多线程和IO流的应用

这篇文章主要介绍了详解Java多线程和IO流的应用,无论是本地文件复制,还是网络多线程下载,对于流的使用都是一样的,需要的朋友可以参考下
2023-05-15

Java多线程Semaphore工具的使用详解

Semaphore是一种用于控制线程并发访问数的同步工具。它通过维护一定数量的许可证来限制对共享资源的访问,许可证的数量就是可以同时访问共享资源的线程数目,需要的朋友可以参考下
2023-05-19

Java多线程开发工具之CompletableFuture的应用详解

做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,本文就来聊聊它的应用吧
2023-03-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录