Java中的并发工具类详解

简介: Java中的并发工具类详解

Java中的并发工具类详解

在Java编程中,处理并发编程是至关重要的,特别是在多核处理器和分布式系统中。Java提供了一系列的并发工具类,用于简化多线程编程和处理并发任务。本文将深入探讨Java中几个重要的并发工具类,包括它们的用途、实现原理和示例代码。

1. CountDownLatch

CountDownLatch概述

CountDownLatch是一种同步工具,允许一个或多个线程等待其他线程完成操作。它通过一个计数器实现,当计数器值为0时,所有等待的线程将被释放。

package cn.juwatech.example;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
   

    public static void main(String[] args) throws InterruptedException {
   
        CountDownLatch latch = new CountDownLatch(3);

        Runnable task = () -> {
   
            try {
   
                // 模拟耗时操作
                Thread.sleep(1000);
                System.out.println("任务完成");
                latch.countDown();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        };

        // 启动三个线程执行任务
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();

        // 等待所有任务完成
        latch.await();
        System.out.println("所有任务已完成");
    }
}

2. Semaphore

Semaphore概述

Semaphore是一种计数信号量,用于控制同时访问特定资源的线程数量。它可以用于限流、连接池等场景。

package cn.juwatech.example;

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
   

    public static void main(String[] args) {
   
        Semaphore semaphore = new Semaphore(2); // 允许最多两个线程同时访问

        Runnable task = () -> {
   
            try {
   
                semaphore.acquire();
                System.out.println("线程" + Thread.currentThread().getName() + "获取许可");
                // 模拟业务操作
                Thread.sleep(2000);
                semaphore.release();
                System.out.println("线程" + Thread.currentThread().getName() + "释放许可");
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        };

        // 启动五个线程
        for (int i = 0; i < 5; i++) {
   
            new Thread(task).start();
        }
    }
}

3. CyclicBarrier

CyclicBarrier概述

CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。它可以用于分阶段任务的并行计算。

package cn.juwatech.example;

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

public class CyclicBarrierExample {
   

    public static void main(String[] args) {
   
        CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程到达屏障点"));

        Runnable task = () -> {
   
            try {
   
                // 模拟任务执行
                Thread.sleep(1000);
                System.out.println("线程" + Thread.currentThread().getName() + "到达屏障点");
                barrier.await();
                System.out.println("线程" + Thread.currentThread().getName() + "继续执行");
            } catch (InterruptedException | BrokenBarrierException e) {
   
                e.printStackTrace();
            }
        };

        // 启动三个线程
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();
    }
}

4. CompletableFuture

CompletableFuture概述

CompletableFuture是Java 8引入的异步编程工具,提供了非常方便的API来处理异步任务和组合多个异步操作。

package cn.juwatech.example;

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
   

    public static void main(String[] args) {
   
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
   
            // 异步任务
            System.out.println("异步任务执行");
        });

        future.thenRun(() -> System.out.println("依赖任务执行"));
    }
}

5. Phaser

Phaser概述

Phaser是Java 7中引入的高级并发同步工具,用于控制多阶段并发任务的执行。

package cn.juwatech.example;

import java.util.concurrent.Phaser;

public class PhaserExample {
   

    public static void main(String[] args) {
   
        Phaser phaser = new Phaser(3);

        Runnable task = () -> {
   
            System.out.println("执行阶段1");
            phaser.arriveAndAwaitAdvance();

            System.out.println("执行阶段2");
            phaser.arriveAndAwaitAdvance();

            System.out.println("执行阶段3");
            phaser.arriveAndDeregister();
        };

        // 启动三个线程
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();
    }
}

总结

本文详细介绍了Java中几个重要的并发工具类,包括CountDownLatch、Semaphore、CyclicBarrier、CompletableFuture和Phaser。这些工具类在多线程编程中扮演着重要角色,帮助开发者实现复杂的并发控制和任务协调。通过合理地使用这些工具类,可以提高程序的并发性能和可维护性。

相关文章
|
3月前
|
安全 Java 编译器
揭秘JAVA深渊:那些让你头大的最晦涩知识点,从泛型迷思到并发陷阱,你敢挑战吗?
【8月更文挑战第22天】Java中的难点常隐藏在其高级特性中,如泛型与类型擦除、并发编程中的内存可见性及指令重排,以及反射与动态代理等。这些特性虽强大却也晦涩,要求开发者深入理解JVM运作机制及计算机底层细节。例如,泛型在编译时检查类型以增强安全性,但在运行时因类型擦除而丢失类型信息,可能导致类型安全问题。并发编程中,内存可见性和指令重排对同步机制提出更高要求,不当处理会导致数据不一致。反射与动态代理虽提供运行时行为定制能力,但也增加了复杂度和性能开销。掌握这些知识需深厚的技术底蕴和实践经验。
75 2
|
9天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
14天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
32 2
|
1月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
25 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
103 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
14 1
|
2月前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
|
3月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
3月前
|
存储 Java
Java 中 ConcurrentHashMap 的并发级别
【8月更文挑战第22天】
51 5
|
3月前
|
存储 算法 Java
Java 中的同步集合和并发集合
【8月更文挑战第22天】
43 5