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

让我们来详细讲解“java多线程JUC常用辅助类详解”的攻略。

一、JUC简介

JUC(Java Util Concurrent)是Java SE 5中推出的一个并发编程框架,提供了许多特殊的并发编程工具类,以及对Java线程池的支持等。

二、JUC常用函数

以下是JUC中常用的辅助类:

1. CountDownLatch(倒计数器)

CountDownLatch是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作,然后再执行。

CountDownLatch内部有一个计数器,这个计数器初始值设定为线程数(通过构造函数设置)。当一个线程完成了自己的任务后,计数器的值就减1,当计数器减为0时,所有线程才会继续执行。

示例

public class CountDownLatchTest {
    public static void main(String[] args) throws InterruptedException{
        CountDownLatch startSignal = new CountDownLatch(1);
        CountDownLatch doneSignal = new CountDownLatch(5);
        for (int i = 0; i < 5; ++i) {
            new Thread(new Worker(startSignal, doneSignal)).start();
        }
        System.out.println("工人准备就绪,开始干活!");
        startSignal.countDown();
        doneSignal.await();
        System.out.println("工作完成,收工!");
    }
}

class Worker implements Runnable {
    private final CountDownLatch startSignal;
    private final CountDownLatch doneSignal;
    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
        this.startSignal = startSignal;
        this.doneSignal = doneSignal;
    }
    public void run() {
        try {
            startSignal.await(); // 线程阻塞,等待主线程计数器变为0后,一起执行
            work();
            doneSignal.countDown(); // 完成后计数器减1
        } catch (InterruptedException ex) {
            // ...
        }
    }
    void work() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " is working");
        Thread.sleep(1000); // 模拟工作
    }
}

2. CyclicBarrier(循环屏障)

CyclicBarrier也是一种同步工具类,它会阻塞几个线程直到它们都到达某个状态后才开始执行,与CountDownLatch的区别是,CyclicBarrier可以用于多线程间互相等待。

当所有线程都调用await()方法时,所有线程才会继续执行。

示例

public class CyclicBarrierTest {
    public static void main(String[] args) throws InterruptedException, BrokenBarrierException{
        CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { // 所有线程达到屏障后执行的操作
            @Override
            public void run() {
                System.out.println("GO!");
            }
        });

        new Thread(new Task(barrier)).start();
        new Thread(new Task(barrier)).start();
        new Thread(new Task(barrier)).start();
    }
}

class Task implements Runnable {
    private final CyclicBarrier barrier;
    Task(CyclicBarrier barrier) {
        this.barrier = barrier;
    }
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + " is ready!");
            barrier.await(); // 等待其他线程到达屏障
            System.out.println(Thread.currentThread().getName() + " is executing!");
        } catch (InterruptedException ex) {
            // ...
        } catch (BrokenBarrierException ex) {
            // ...
        }
    }
}

3. Semaphore(信号量)

Semaphore是一种控制访问资源的同步工具,用于控制同时访问某个资源的线程数量。

Semaphore有两种模式:公平模式和非公平模式。在公平模式下,Semaphore会根据线程的等待时间来分配许可证;在非公平模式下,Semaphore会随机分配许可证。

Semaphore可以用于控制并发线程的数量,例如限制最大并发数。

示例

public class SemaphoreTest {
    public static void main(String[] args) throws InterruptedException {
        Semaphore semaphore = new Semaphore(2); // 允许两个线程同时执行
        for (int i = 1; i <= 5; ++i) {
            new Thread(new Task(semaphore, i)).start();
        }
    }
}

class Task implements Runnable {
    private final Semaphore semaphore;
    private final int id;
    Task(Semaphore semaphore, int id) {
        this.semaphore = semaphore;
        this.id = id;
    }
    public void run() {
        try {
            semaphore.acquire(); // 获取一个许可证
            System.out.println(Thread.currentThread().getName() + " acquire semaphore " + id);
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            // ...
        } finally {
            semaphore.release(); // 释放一个许可证
            System.out.println(Thread.currentThread().getName() + " release semaphore " + id);
        }
    }
}

三、JUC的优点

在使用JUC的辅助类时,我们可以获得以下几个优点:

  • 可以提高程序的运行效率;
  • 可以减少程序的资源消耗,提高程序性能;
  • 可以更好地管理和控制多线程程序,减少线程间的竞争和冲突。

综上所述,JUC提供了一些强大的辅助类,可以用来控制线程的运行,提高程序的运行效率和性能。在实际使用中,根据不同的需求和场景可以采用不同的辅助类进行程序设计。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程JUC常用辅助类详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 基于编译虚拟机jvm—openjdk的编译详解

    基于编译虚拟机jvm—openjdk的编译详解 在这篇攻略中,我们将通过使用编译虚拟机jvm-openjdk来编译代码。下面是详细的步骤: 步骤一:安装OpenJDK 在使用OpenJDK编译代码之前,我们需要先安装它。在Linux系统中,我们可以通过以下命令来安装OpenJDK: sudo apt-get install default-jdk 在Wind…

    Java 2023年5月26日
    00
  • maven中配置项目的jdk版本无效的排查方式

    请听我讲解maven中配置项目的jdk版本无效的排查方式的完整攻略。 1. 确认maven中配置jdk版本是否正确 在pom.xml文件中配置项目使用的jdk版本,如果这个配置是正确的,那么可以使用maven命令查看项目依赖的jdk版本: mvn help:effective-pom 执行该命令后,会在终端输出effective-pom的结果,其中即可看到j…

    Java 2023年5月20日
    00
  • 详解java模板和回调机制

    当我们在编写一些框架或者类库时,经常会用到模板和回调机制。在Java中,模板指的是一个通用的算法框架,其中某些步骤可以由子类实现,而回调指的是让对象调用一个指定的方法来进行操作。 一、什么是模板 模板是一种设计模式,它可以让你定义一组算法,并允许子类为一个或多个步骤提供实现。模板模式让子类在不改变算法结构的情况下重定义算法中的某些步骤,它可以使算法的结构保持…

    Java 2023年5月26日
    00
  • 详解springboot springsecuroty中的注销和权限控制问题

    详解 Spring Boot Spring Security 中的注销和权限控制问题 前言 Spring Boot Spring Security 是一个非常常用的技术组合,它们可以提供很好的安全性,和身份认证、授权、限制等重要功能,但是在实际开发中可能会遇到注销和权限控制相关的问题,需要我们了解并深入研究。 正文 注销功能 注销功能是常见的需求,用户在退出…

    Java 2023年6月3日
    00
  • 关于SpringBoot单元测试(cobertura生成覆盖率报告)

    下面我详细讲解关于SpringBoot单元测试以及cobertura生成覆盖率报告的攻略。 什么是单元测试 单元测试是一种测试方法,该方法用于测试软件设计的最小单位——单元。在Java中,一个单元通常指的是一个方法。单元测试通常是在开发过程中进行的,以确保代码的每个部分都经过了适当的测试。单元测试通常是在代码完成之前进行,并且可以使用自动化测试工具进行。 S…

    Java 2023年5月19日
    00
  • kafka生产者和消费者的javaAPI的示例代码

    以下是关于Kafka生产者和消费者JavaAPI的示例代码的完整攻略。 Kafka Kafka是一个分布式流处理平台,主要由以下组件构成: 生产者(Producer) 消费者(Consumer) 主题(Topic) 分区(Partition) 偏移量(Offset) Broker ZooKeeper Kafka的生产者和消费者JavaAPI提供了开发人员构建…

    Java 2023年5月19日
    00
  • mybatis 实体类字段大小写问题 字段获取不到值的解决

    问题背景:在使用 MyBatis 进行数据查询时,有时会遇到实体类字段大小写问题,导致查询结果为空,需要解决该问题。 解决思路:针对实体类字段大小写问题,我们可以使用 MyBatis 提供的一些功能进行解决,包括在 SQL 映射文件中配置 resultMap、使用@Result注解或通过配置全局配置文件等方法。 具体步骤如下: 配置resultMap 在 S…

    Java 2023年5月26日
    00
  • 深入理解springMVC中的Model和Session属性

    在Spring MVC中,Model和Session属性是常用的数据传递方式。Model属性用于在请求处理期间传递数据,而Session属性用于在多个请求之间传递数据。下面是深入理解Spring MVC中的Model和Session属性的完整攻略: Model属性 1. Model属性的作用 Model属性用于在请求处理期间传递数据。在Spring MVC中…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部