简化Java多线程编程的实用利器!

ThreadUtil通过封装Java标准库中的ExecutorServiceCountDownLatch等并发工具,提供了一系列简洁易用的方法。

    1. 异步执行任务(excuteAsync)
  1. ThreadUtil(excuteAsync)
  2. 方法允许开发者以异步方式执行任务,避免阻塞主线程。
    • • 示例代码:
  • • 该方法返回一个Future对象,可以通过调用get()方法获取任务结果。
    1. 在公共线程池中执行任务(execute)
    • ThreadUtil.execute()方法直接在公共线程池中执行任务,无需手动创建线程池。
    • • 示例代码:
  • • 这种方式适合需要频繁执行小任务的场景。
    1. 创建新的线程池(newExecutor)
  1. ThreadUtil.newExecutor()
  2. 方法允许开发者创建自定义的线程池,并设置核心线程数和最大线程数。
  • • 通过这种方式,可以更好地控制线程资源的分配。
    1. 等待一组线程完成(newCountDownLatch)
  1. ThreadUtil.newCountDownLatch(int count)
  2. 方法创建一个
  3. CountDownLatch
  4. 对象,用于等待一组线程完成。
  • • 这种方式适用于需要同步多个子任务的场景。
    1. 挂起当前线程(sleep)
  1. ThreadUtil.sleep(long time)
  2. 方法封装了
  3. Thread.sleep()
  4. ,可以安全地挂起当前线程。
  • • 该方法避免了因未正确处理中断信号而导致的异常。
    1. 获取当前线程信息( currentThread)
  1. ThreadUtil.currentThread()
  2. 方法返回当前线程的实例。
  • • 该方法便于开发者获取当前线程的信息并进行调试。
    1. 结束线程(interrupt)
  1. ThreadUtil.interrupt(Thread thread)
  2. 方法可以安全地中断指定的线程。
  • • 该方法确保了中断信号的正确处理。
    1. 获取线程堆栈信息(getStack trace)
  1. ThreadUtil.getStack trace(Thread thread)
  2. 方法返回指定线程的堆栈信息。
  • • 该方法便于开发者分析线程运行时的状态。

我们通过一个简单的业务场景来演示其使用方法。订单处理需要调用多个异步服务,并在所有服务完成后返回结果。

代码实现

ini 复制代码
import cn.hutool.core.util.ThreadUtil;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;

publicclassOrderProcessor {
    publicstaticvoidmain(String[] args)throws InterruptedException {
        // 创建一个CountDownLatch对象,用于等待所有子任务完成
        CountDownLatchlatch=newCountDownLatch(3);

        // 异步调用三个服务
        CompletableFuture<Void> future1 = ThreadUtil(excuteAsync(() -> {
            System.out.println("服务1开始执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("服务1执行完成");
            latch.countDown();
        }));

        CompletableFuture<Void> future2 = ThreadUtil(excuteAsync(() -> {
            System.out.println("服务2开始执行");
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("服务2执行完成");
            latch.countDown();
        }));

        CompletableFuture<Void> future3 = ThreadUtil(excuteAsync(() -> {
            System.out.println("服务3开始执行");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("服务3执行完成");
            latch.countDown();
        }));

        // 等待所有服务完成
        latch.await();

        System.out.println("所有服务已完成,开始汇总结果");
    }
}

运行结果:

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

相关推荐
金銀銅鐵3 小时前
[Java] JDK 9 新变化之 Convenience Factory Methods for Collections
java·后端
微小冷4 小时前
Rust图形界面教程:egui基础组件的使用
后端·rust·gui·egui·button·panel·用户图形界面
javadaydayup4 小时前
同样是简化代码,Lambda 和匿名内部类的核心原理是什么?
后端
Yeats_Liao4 小时前
时序数据库系列(六):物联网监控系统实战
数据库·后端·物联网·时序数据库
金銀銅鐵4 小时前
[Java] 用 Swing 生成一个最大公约数计算器
java·后端
brzhang4 小时前
我觉得可以试试 TOON —— 一个为 LLM 而生的极致压缩数据格式
前端·后端·架构
苏三的开发日记4 小时前
库存预扣减之后,用户订单超时之后补偿库存的方案
后端
知其然亦知其所以然5 小时前
这波AI太原生了!SpringAI让PostgreSQL秒变智能数据库!
后端·spring·postgresql
观望过往6 小时前
Spring Boot 集成 EMQ X 4.0 完整技术指南
java·spring boot·后端·emqx