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日

相关文章

  • java实现文件夹上传功能实例代码(SpringBoot框架)

    针对“java实现文件夹上传功能实例代码(SpringBoot框架)”这个话题,我将提供完整的攻略,包含以下几个部分:需求分析、技术选型、代码实现和测试验证。 需求分析 在开始代码的编写,首先需要对这个需求进行分析,确认下面几个问题: 需要实现何种文件上传功能? 在SpringBoot框架下应该如何实现? 有无需要兼容的客户端浏览器或平台? 针对以上问题,根…

    Java 2023年5月20日
    00
  • 在Spring Data JPA中引入Querydsl的实现方式

    下面是在Spring Data JPA中引入Querydsl的实现方式的攻略: 1. 引入依赖 首先,我们需要在项目中引入Querydsl相关的依赖,具体如下: <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId&…

    Java 2023年5月20日
    00
  • Java的Spring框架中AOP项目的一般配置和部署教程

    Spring框架中AOP项目的一般配置 在Java的Spring框架中,AOP项目的一般配置主要分为两个方面:1、定义切面和通知 2、把切面和通知织入目标对象中。 在定义切面和通知时,可以使用AspectJ注解或XML配置方式。其中使用AspectJ注解方式时,可以使用如下注解: @Aspect: 定义一个切面 @Pointcut:定义切点,即对哪些方法进行…

    Java 2023年5月19日
    00
  • 解决fastjson泛型转换报错的解决方法

    解决fastjson泛型转换报错的解决方法 问题描述: fastjson是Java中一个非常常用的JSON处理库,其中序列化和反序列化功能特别强大,但在使用其进行泛型反序列化时,会出现“com.alibaba.fastjson.JSONException: parse error”等异常,这就涉及到fastjson泛型转换错误的问题。 解决方法: 解决这个问…

    Java 2023年5月26日
    00
  • MVC异常处理详解

    下面是关于“MVC异常处理详解”的完整攻略,包含两个示例说明。 MVC异常处理详解 在MVC(Model-View-Controller)架构中,异常处理是一个非常重要的问题。在应用程序中,可能会发生各种各样的异常,如空指针异常、数据库异常、网络异常等等。如果不进行适当的异常处理,这些异常可能会导致应用程序崩溃或者无法正常工作。本文将详细介绍如何在MVC架构…

    Java 2023年5月17日
    00
  • java webservice上传下载文件代码分享

    下面是“java webservice上传下载文件代码分享”的完整攻略: 1. 准备工作 在开始实现文件上传下载的功能之前,我们需要准备好以下几点: 安装Java与Eclipse IDE开发环境; 下载并安装Apache Tomcat服务器; 导入JAX-WS 开发包,以便能够使用JAX-WS创建Webservice服务。 2. 创建文件上传下载的Webse…

    Java 2023年5月19日
    00
  • MyBatis 动态SQL使用及原理

    MyBatis 动态SQL使用及原理 什么是动态SQL 在使用MyBatis之前,我们可能更多的使用的是Hibernate等ORM框架,这些框架在我们进行SQL编写时,一般会使用面向对象的方式来进行编写,使用类似HQL等语言进行编写。但是MyBatis则不同,它更加接近于传统的SQL编写方式,即使用XML等方式来编写SQL语句。在这种方式下,SQL语句是一个…

    Java 2023年5月19日
    00
  • 浅谈@RequestMapping注解的注意点

    浅谈@RequestMapping注解的注意点 @RequestMapping注解是Spring MVC中最常用的注解之一,它用于将HTTP请求映射到控制器方法。在本文中,我们将详细讲解@RequestMapping注解的注意点,并提供两个示例来说明这个过程。 注意点 在使用@RequestMapping注解时,我们需要注意以下几点: value属性 @Re…

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