线程池工具类:简化并发编程,提升任务执行效率

news/2025/2/21 16:36:43/

文章目录

      • 线程池工具类:简化并发编程,提升任务执行效率
      • 线程池工具类的设计目标
      • 线程池工具类的实现
      • 工具类的使用示例
        • 1. 提交任务
        • 2. 监控线程池状态
        • 3. 关闭线程池
      • 工具类的核心功能
      • 总结


线程池工具类:简化并发编程,提升任务执行效率

在多线程编程中,线程池是一种重要的资源管理工具。它可以有效地管理线程的生命周期,避免频繁创建和销毁线程带来的性能开销,同时还能控制并发任务的执行顺序和资源占用。为了简化线程池的使用,我们可以封装一个通用的线程池工具类,提供便捷的任务提交、线程池配置和监控功能。


线程池工具类的设计目标

  1. 简化线程池的创建和管理

    • 提供默认的线程池配置,同时支持自定义配置。
    • 封装线程池的创建逻辑,避免重复代码。
  2. 支持多种任务提交方式

    • 支持提交 RunnableCallable 任务。
    • 支持获取任务的执行结果(Future)。
  3. 提供线程池监控功能

    • 实时获取线程池的状态(如活跃线程数、任务队列大小等)。
    • 支持关闭线程池并等待任务完成。
  4. 异常处理

    • 捕获任务执行中的异常,避免线程池因异常而崩溃。

线程池工具类的实现

以下是一个完整的线程池工具类实现:

java">import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;/*** 线程池工具类*/
public class ThreadPoolUtil {// 默认线程池配置private static final int DEFAULT_CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors(); // 核心线程数private static final int DEFAULT_MAX_POOL_SIZE = DEFAULT_CORE_POOL_SIZE * 2; // 最大线程数private static final int DEFAULT_QUEUE_CAPACITY = 100; // 任务队列容量private static final long DEFAULT_KEEP_ALIVE_TIME = 60L; // 线程空闲时间(秒)// 线程池实例private static volatile ThreadPoolExecutor threadPool;// 线程工厂(用于自定义线程名称)private static final ThreadFactory threadFactory = new ThreadFactory() {private final AtomicInteger threadNumber = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "pool-thread-" + threadNumber.getAndIncrement());}};// 私有构造方法,禁止外部实例化private ThreadPoolUtil() {}/*** 获取线程池实例(单例模式)** @return 线程池实例*/public static ThreadPoolExecutor getThreadPool() {if (threadPool == null) {synchronized (ThreadPoolUtil.class) {if (threadPool == null) {threadPool = new ThreadPoolExecutor(DEFAULT_CORE_POOL_SIZE,DEFAULT_MAX_POOL_SIZE,DEFAULT_KEEP_ALIVE_TIME,TimeUnit.SECONDS,new LinkedBlockingQueue<>(DEFAULT_QUEUE_CAPACITY),threadFactory,new ThreadPoolExecutor.AbortPolicy() // 拒绝策略:直接抛出异常);}}}return threadPool;}/*** 提交任务(Runnable)** @param task 任务*/public static void execute(Runnable task) {getThreadPool().execute(task);}/*** 提交任务(Callable)** @param task 任务* @param <T>  返回值类型* @return Future 对象*/public static <T> Future<T> submit(Callable<T> task) {return getThreadPool().submit(task);}/*** 关闭线程池(等待所有任务完成)*/public static void shutdown() {if (threadPool != null) {threadPool.shutdown();try {if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {threadPool.shutdownNow();}} catch (InterruptedException e) {threadPool.shutdownNow();Thread.currentThread().interrupt();}}}/*** 立即关闭线程池(不等待任务完成)*/public static void shutdownNow() {if (threadPool != null) {threadPool.shutdownNow();}}/*** 获取线程池状态** @return 线程池状态信息*/public static String getThreadPoolStatus() {if (threadPool == null) {return "Thread pool is not initialized.";}return String.format("Pool Status: [CorePoolSize: %d, ActiveThreads: %d, CompletedTasks: %d, QueueSize: %d]",threadPool.getCorePoolSize(),threadPool.getActiveCount(),threadPool.getCompletedTaskCount(),threadPool.getQueue().size());}
}

工具类的使用示例

1. 提交任务
java">public class ThreadPoolExample {public static void main(String[] args) {// 提交 Runnable 任务ThreadPoolUtil.execute(() -> {System.out.println("Runnable task is running.");});// 提交 Callable 任务并获取结果Future<String> future = ThreadPoolUtil.submit(() -> {Thread.sleep(1000);return "Callable task result";});try {System.out.println("Callable task result: " + future.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}// 打印线程池状态System.out.println(ThreadPoolUtil.getThreadPoolStatus());// 关闭线程池ThreadPoolUtil.shutdown();}
}
2. 监控线程池状态
java">System.out.println(ThreadPoolUtil.getThreadPoolStatus());
3. 关闭线程池
java">// 等待所有任务完成
ThreadPoolUtil.shutdown();// 立即关闭线程池
ThreadPoolUtil.shutdownNow();

工具类的核心功能

  1. 线程池的单例模式

    • 通过双重检查锁定(Double-Checked Locking)确保线程池的单例性。
  2. 自定义线程工厂

    • 为线程池中的线程设置自定义名称,方便调试和监控。
  3. 任务提交

    • 支持 RunnableCallable 任务的提交,并返回 Future 对象以获取任务结果。
  4. 线程池关闭

    • 提供两种关闭方式:shutdown(等待任务完成)和 shutdownNow(立即关闭)。
  5. 线程池状态监控

    • 实时获取线程池的核心线程数、活跃线程数、已完成任务数和任务队列大小。

总结

通过封装线程池工具类,我们可以简化多线程编程的复杂性,提升代码的可维护性和可读性。该工具类不仅提供了默认的线程池配置,还支持任务提交、线程池监控和关闭等功能,能够满足大多数并发编程的需求。在实际项目中,可以根据具体场景进一步扩展和优化该工具类。


http://www.ppmy.cn/news/1573930.html

相关文章

基于腾讯云大模型知识引擎×DeepSeek构建八字、六爻赛博算卦娱乐应用

引言 随着DeepSeek的火爆&#xff0c;其强大的思维链让不少人越用越香&#xff0c;由于其缜密的思维和推理能力&#xff0c;不少人开发出了不少花里胡哨的玩法&#xff0c;其中一种就是以八字、六爻为代表的玄学文化正以“赛博玄学”的新形态席卷年轻群体。 针对于八字、六爻…

QT事件循环

文章目录 主事件循环事件循环事件调度器事件处理投递事件发送事件 事件循环的嵌套线程的事件循环deleteLater与事件循环QEventLoop类QEventLoop应用等待一段时间同步操作模拟模态对话框 参考 本文主要对QT中的事件循环做简单介绍和使用 Qt作为一个跨平台的UI框架&#xff0c;其…

Python安装与环境配置全程详细教学(包含Windows版和Mac版)

Windows版 Python的安装与环境配置 1.下载Python Python下载地址&#xff1a;Download Python | Python.org 可以在这里直接点击下载&#xff0c;就会下载你电脑对应的最新版本 如果你要是不想下载对应的最新版或者因为某些原因你想安装某一特定版本的Python你可以在上面的…

arm环境下,wpa_supplicant交叉编译+wifi sta连接详解

1、前言 wpa_supplicant 是一个用于 WiFi 客户端的加密认证工具&#xff0c;支持 WEP、WPA、WPA2 等多种加密方式。它通常与 wpa_cli 配合使用&#xff0c;用于管理 WiFi 连接。本文讲解wpa_supplicant 交叉编译全过程以及开发板使用wpa_supplican和udhcpc连接wifi全过程详解。…

第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)

重要信息 大会官网&#xff1a;www.amtme.org&#xff08;了解会议&#xff0c;投稿等&#xff09; 大会时间&#xff1a;2025年3月21-23日 大会地点&#xff1a;中国-广州 简介 2025年第十二届先进制造技术与材料工程 (AMTME 2025) 定于2025年3月21-23日在中国广州隆重举…

Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…

Matlab 移动最小二乘法(MLS,一维)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 我们要明白MLS是想用一组基函数来局部近似我们的目标函数,它非常类似于我们所学的泰勒公式,只不过它是基于局部的。其具体的原理如下所述:假设Ω为范数向量空间,而u为Ω内场变量的标量。为了形成一个近似函数 u…

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道&#xff08;通用路由封装&#xff0c;Generic Routing Encapsulation&#xff09;协议号47实验&#xff1a;思科&#xff1a;开始实施&#xff1a; 华为&#xff1a;开始实施&#xff1a; eBGP实施思科&#xff1a;华为&#xff1a; GRE隧道&#xff08;通用路…