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

 更新时间:2021年09月27日 15:30:16   作者:不会编程的派大星  
这篇文章主要为大家介绍了java多线程及并发编程中JUC常用辅助类,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助

1.countDownLatch

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

在这里插入图片描述

简单代码实现:

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

import java.util.concurrent.CountDownLatch;
/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-24 16:55
 **/
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;
/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-24 17:31
 **/
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;
/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-24 17:31
 **/
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;
/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-24 18:26
 **/
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辅助类的资料请关注脚本之家其它相关文章!

相关文章

  • Java后端向前端返回文件流实现下载功能

    Java后端向前端返回文件流实现下载功能

    后端可以使用Java中servlet提供的HttpServletResponse,核心步骤是要设置响应的数据类型,设置为某一类文件类型或二进制格式,以及响应头,然后用ServletOutputStream将文件以流的形式发送到前端,本文介绍Java后端向前端返回文件流实现下载功能,感兴趣的朋友一起看看吧
    2023-12-12
  • form表单回写技术java实现

    form表单回写技术java实现

    这篇文章主要为大家详细介绍了java实现form表单回写技术的相关资料,需要的朋友可以参考下
    2016-04-04
  • maven项目在svn中的上传与检出的方法

    maven项目在svn中的上传与检出的方法

    企业开发中经常使用svn来为我们控制代码版本,也经常使用maven来管理项目。下面将介绍一下如何将maven项目上传到svn中,如何将项目从svn中检出,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Java Spring boot日期和时间统一设置三种方法

    Java Spring boot日期和时间统一设置三种方法

    时间和日期的统一设置在项目中经常是会遇到的,下面这篇文章主要给大家介绍了关于Java Spring boot日期和时间统一设置的三种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • springboot内置tomcat调优并发线程数解析

    springboot内置tomcat调优并发线程数解析

    这篇文章主要介绍了springboot内置tomcat调优并发线程数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java中你的项目应该如何正确分层

    java中你的项目应该如何正确分层

    这篇文章主要介绍了java中你的项目应该如何正确分层,业务分层对于代码规范是比较重要,决定着以后的代码是否可复用,感兴趣的可以了解一下
    2021-04-04
  • java生成XML的方法【附demo源码下载】

    java生成XML的方法【附demo源码下载】

    这篇文章主要介绍了java生成XML的方法,涉及java针对xml格式文件的简单操作技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2016-12-12
  • Java中线程中断的几种方法小结

    Java中线程中断的几种方法小结

    在Java中,线程中断是一种协作机制,它通过设置线程的中断标志位来通知线程需要中断,本文主要介绍了Java中线程中断的几种方法小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Idea 配置国内 Maven 源的图文教程

    Idea 配置国内 Maven 源的图文教程

    这篇文章主要介绍了Idea 配置国内 Maven 源的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Spring Boot中使用Activiti的方法教程(二)

    Spring Boot中使用Activiti的方法教程(二)

    工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,下面这篇文章主要给大家介绍了关于Spring Boot中使用Activiti的相关资料,需要的朋友可以参考下
    2018-08-08

最新评论