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 map转Multipart/form-data类型body实例

    下面是java map转Multipart/form-data类型body的详细攻略: 创建一个MultiPart对象 在将Map类型转换成Multipart/form-data类型之前,我们需要先创建一个MultiPart对象作为容器,并传入Content-Type为multipart/form-data的Header。 MultiPart multiPa…

    Java 2023年5月20日
    00
  • Java抛出异常与自定义异常类应用示例

    Java中的异常处理是必不可少的,它可以让我们的代码更加健壮,提高程序的容错性。Java抛出的异常有两种,一种是系统自带的异常,如IOException、NullPointerException等,另一种是自定义异常,可以根据业务需要自行定义。 本篇攻略将详细讲解Java抛出异常与自定义异常类的应用示例,希望能够对大家有所帮助。 Java抛出异常示例 Jav…

    Java 2023年5月27日
    00
  • spring boot的maven配置依赖详解

    下面我将为你讲解“springboot的maven配置依赖详解”的完整攻略,包括以下内容: Maven介绍 Spring Boot Maven依赖配置详解 示例:添加Web依赖 示例:添加数据库依赖 1. Maven介绍 Maven是一个项目管理和构建自动化工具,它可以帮助Java项目进行构建、依赖管理和发布。Maven通过一组规范来描述项目的结构和依赖,并…

    Java 2023年5月15日
    00
  • iis、apache、nginx使用X-Frame-Options防止网页被Frame的解决方法

    在Web开发中,防止网页被Frame劫持成为了必须的安全措施之一,其中一个重要的方式是使用HTTP响应头中的“X-Frame-Options”来限制哪些网站可以使用Frame加载该网页。 不同的Web服务器软件可能实现方式略有不同,以下分别介绍如何在IIS、Apache以及Nginx中使用X-Frame-Options来防止网页被Frame。 IIS中使用X…

    Java 2023年6月15日
    00
  • logback过滤部分日志输出的操作

    当我们在开发、调试和运行程序时,经常会遇到需要限制部分日志的输出情况。这时候就需要使用logback的过滤器来实现。 在logback中,我们可以通过使用标签来定义过滤器。logback提供了多种过滤器,如LevelFilter、ThresholdFilter、AndFilter、OrFilter、TurboFilter等,通过组合这些过滤器,实现对日志输出…

    Java 2023年5月20日
    00
  • Java抢红包的红包生成算法

    下面是“Java抢红包的红包生成算法”的完整攻略。 一、概述 “Java抢红包的红包生成算法”是一种随机分配金额的算法,可以用于生成指定金额的红包,并按照一定的规则把红包分配给多个人。该算法可以用于各种在线支付、社交娱乐等场景。 二、算法原理 “Java抢红包的红包生成算法”基于二倍均值法实现,具体原理如下: 假设红包总金额为totalMoney,红包个数为…

    Java 2023年5月19日
    00
  • Java编译期注解的作用是什么?

    Java编译期注解是一种特殊的注释,它们可以在Java代码编译时被读取并处理。在Java语言中,编译期注解的作用非常广泛,可以用于静态检查、自动生成代码、代码优化等方面。 以下是Java编译期注解的作用以及使用攻略: 静态检查 编译器可以读取并处理编译期注解,从而帮助我们进行代码静态检查。例如,我们可以使用注解来标记一些警告或错误信息,并在代码编译时进行检查…

    Java 2023年5月11日
    00
  • LINQ to XML的编程基础

    LINQ to XML 是用于处理 XML 文档的 API,它允许我们通过 LINQ 查询语言来查询和对 XML 文档进行操作,相比传统 DOM 模型和 SAX 模型的 XML 处理方式,LINQ to XML 更具有灵活性和易用性。下面就是 LINQ to XML 的编程基础攻略: 1. 首先,需要引用相应的命名空间 使用 LINQ to XML,需要引用…

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