当前位置: 首页 > news >正文

【Java】多线程篇 —— 线程池

目录

  • 线程池
    • 线程池的核心类
    • `ThreadPoolExecutor` 的构造方法
    • 线程池的常用方法
      • 提交任务
      • 关闭线程池
      • 监控线程池状态
    • 通过 `Executors` 快速创建线程池
    • 线程池的完整示例
    • 常见问题与解决方案
    • 总结

线程池

线程池的核心类

Java 线程池的实现基于 java.util.concurrent 包,核心类和接口如下:

类/接口 说明
Executor 最基础的线程池接口,仅定义 execute(Runnable) 方法。
ExecutorService 扩展了 Executor,提供更丰富的线程池管理功能(如任务提交、关闭)。
ThreadPoolExecutor 线程池的核心实现类,所有功能均通过此类实现。
ScheduledExecutorService 支持定时任务和周期性任务的线程池接口。
Executors 工厂类,提供快捷创建线程池的静态方法(如 newFixedThreadPool)。

ThreadPoolExecutor 的构造方法

ThreadPoolExecutor 的构造函数包含7个参数,以下是详细说明:

public ThreadPoolExecutor(
    int corePoolSize,           // 核心线程数
    int maximumPoolSize,        // 最大线程数
    long keepAliveTime,         // 临时线程的空闲存活时间
    TimeUnit unit,              // 时间单位(秒、毫秒等)
    BlockingQueue<Runnable> workQueue, // 任务队列
    ThreadFactory threadFactory,       // 线程工厂(自定义线程创建)
    RejectedExecutionHandler handler   // 拒绝策略
)

参数详解

  1. corePoolSize
    • 作用:线程池中始终保持存活的线程数量(即使空闲也不会被回收)。
    • 示例:若设置为3,线程池最少有3个线程处理任务。
  2. maximumPoolSize
    • 作用:线程池允许创建的最大线程数(包括核心线程和临时线程)。
    • 示例:若设置为10,当任务队列满时,最多创建10个线程。
  3. keepAliveTime + unit
    • 作用:临时线程(超出核心线程数的线程)的空闲存活时间。超过该时间且无任务执行时,临时线程会被回收。
    • 示例60, TimeUnit.SECONDS 表示临时线程空闲60秒后终止。
  4. workQueue
    • 作用:存储待执行任务的队列。
    • 常用实现类
      • ArrayBlockingQueue:有界队列(需指定容量)。
      • LinkedBlockingQueue:无界队列(默认容量为 Integer.MAX_VALUE)。
      • SynchronousQueue:直接传递任务的队列(无存储能力)。
  5. threadFactory
    • 作用:自定义线程的创建方式(如设置线程名称、优先级)。
    • 默认实现Executors.defaultThreadFactory()
  6. handler
    • 作用:当任务队列已满且线程数达到最大值时的拒绝策略。
    • 内置策略
      • AbortPolicy(默认):抛出 RejectedExecutionException 异常。
      • CallerRunsPolicy:由提交任务的线程直接执行任务。
      • DiscardPolicy:静默丢弃新任务。
      • DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新提交新任务。

线程池的常用方法

提交任务

方法 说明
void execute(Runnable task) 提交一个无需返回值的任务(适合异步执行)。
Future<T> submit(Callable<T> task) 提交一个有返回值的任务,通过 Future 获取结果或异常。
Future<?> submit(Runnable task) 提交 Runnable 任务,返回的 Future 可用于判断任务是否完成。

示例

ExecutorService executor = Executors.newFixedThreadPool(3);

// 使用 execute 提交任务(无返回值)
executor.execute(() -> 

相关文章:

  • 蓝桥杯 灯笼大乱斗【算法赛】
  • 设计模式之命令模式
  • Git操作指南:分支合并、回退及其他重要操作
  • json介绍、python数据和json数据的相互转换
  • GPIO概念
  • 分类预测 | Matlab实现GWO-LSSVM灰狼算法优化最小二乘支持向量机多特征分类预测
  • js加密之延伸requestAnimationFrame
  • 【Block总结】SAFMN,空间自适应调制与局部特征增强的协同设计|即插即用
  • 面试基础 ---深入解析JDK8类加载机制
  • Python核心技术,Django学习基础入门教程(附环境安装包)
  • iOS UICollectionViewCell 点击事件自动化埋点
  • 计算机毕业设计SpringBoot+Vue.js相亲网站(源码+文档+PPT+讲解)
  • Unity中动态切换光照贴图LightProbe的方法
  • C++实现3D(EasyX)详细教程
  • DeepSeek蒸馏TinyLSTM实操指南
  • deepseek使用记录18——文化基因之文化融合
  • 数据结构(初阶)(六)----队列
  • Linux NAT和代理服务器
  • 【开源免费】基于SpringBoot+Vue.JS周边游平台系统(JAVA毕业设计)
  • 0x05 部门功能开发日志技术
  • 广西鹿寨一水文站“倒刺扶手”存安全隐患,官方通报处理情况
  • “走进书适圈”:一周城市生活
  • 中期选举后第三势力成“莎拉弹劾案”关键,菲律宾权斗更趋复杂激烈
  • “多规合一”改革7年成效如何?自然资源部总规划师亮成绩单
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯今日执行死刑
  • 中国军网:带你揭开3所新调整组建军队院校的神秘面纱