news 2026/4/23 22:18:18

Java线程池详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java线程池详解

阅读本文前,建议先阅读《Java 线程与原理》了解 Java 线程的基本使用(ThreadRunnableCallableFutureTask的关系)

Executor 框架

Executor 框架是 Java 5 引入的并发工具,位于java.util.concurrent包中,其核心目标是将线程任务的提交与任务的执行解耦,是 Java 线程池的核心实现框架。

Executor 框架的核心接口:

  • Executor:最顶层的接口,定义了execute(Runnable command)方法。
public interface Executor { void execute(Runnable command); }
  • ExecutorService:扩展了Executor,增加了管理线程池生命周期的方法(如shutdown()submit()invokeAll()等)。
public interface ExecutorService extends Executor { <T> Future<T> submit(Callable<T> task); List<Runnable> shutdownNow(); boolean awaitTermination(long timeout, TimeUnit unit); // ... }
  • ScheduledExecutorService:支持延迟或周期性执行任务。
public interface ScheduledExecutorService extends ExecutorService { ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit); ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit); // ... }
  • ThreadPoolExecutor:ExecutorService 的核心实现类,提供了丰富的线程池配置选项。

接口与类关系:

Executor 框架的使用示意图:

ThreadPoolExecutor

构造函数:

public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler )

参数说明:

参数说明
corePoolSize核心线程数。即使空闲,这些线程也不会被回收(除非设置 allowCoreThreadTimeOut(true))。当低于这个数值,总是新建线程执行任务;超过这个数值后,会把任务放到 workQueue排队,当队列满时,才在 maximumPoolSize 范围内新建线程执行任务。
maximumPoolSize最大线程数。当活动线程数达到这个数值后,将会被拒绝掉(见后面的 RejectedExecutionHandler )。
keepAliveTime非核心线程闲置时的超时时长。超过这个时长,闲置的非核心线程就会被回收。
unitkeepAliveTime 参数的时间单位,有 TimeUnit.MILLISECOND 、TimeUnit.SECOND 、TimeUnit.MINUTE 等
workQueue任务队列,用于缓存待执行的任务。常用实现:1、ArrayBlockingQueue:基于数组结构的的先进先出有界阻塞队列,此队列创建时必须指定大小。2、LinkedBlockingQueue:基于链表结构的先进先出无界阻塞队列,如果创建时没有指定此队列大小,则默认为 Integer.MAX_VALUE 。3、SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。相当于队列容量大小为 1 。4、PriorityBlockingQueue:一个具有优先级的无限阻塞队列,可用于设置任务处理的优先级。
threadFactory线程工厂,用于自定义线程创建(如命名、优先级等)。
handler拒绝策略,当线程池和队列都满时如何处理新任务。常用实现:1、AbortPolicy(默认):丢弃任务,并抛出 RejectedExecutionException 异常。2、DiscardPolicy:也是丢弃任务,但是不抛出异常。3、DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)4、CallerRunsPolicy:由调用线程处理该任务

ThreadPoolExecutor 线程池处理流程:

ThreadPoolExecutor 线程池使用示例:

import java.util.concurrent.*; public class ThreadPoolExample { public static void main(String[] args) { ThreadFactory namedThreadFactory = r -> { Thread t = new Thread(r, "MyPool-Thread"); t.setDaemon(false); return t; }; BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100); RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, 4, 30, TimeUnit.SECONDS, workQueue, namedThreadFactory, handler ); for (int i = 0; i < 10; i++) { final int taskId = i; executor.submit(() -> { System.out.println("Task " + taskId + " executed by " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); } executor.shutdown(); } }

Executors 工厂类

Java 提供了Executors工具类,用于快速创建常见线程池:

方法说明内部实现
newFixedThreadPool(int n)固定大小线程池core = max = n,无界队列
newCachedThreadPool()缓存线程池core = 0,max = Integer.MAX_VALUE,SynchronousQueue
newSingleThreadExecutor()单线程池core = max = 1,无界队列
newScheduledThreadPool(int n)支持定时/周期任务ScheduledThreadPoolExecutor

其中,newFixedThreadPoolnewCachedThreadPool在高负载下可能导致 OOM(因使用无界队列或过多线程)。因此,生产环境强烈建议手动创建ThreadPoolExecutor并明确参数。

ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor是专门用于延迟执行或周期性执行任务。它是ThreadPoolExecutor的子类,同时实现了ScheduledExecutorService接口。

ScheduledThreadPoolExecutor 特性:

  • 支持一次性延迟执行。
  • 支持 固定频率(fixed-rate)或 固定延迟(fixed-delay)的周期性任务。
  • 线程复用:多个定时任务共享线程池中的线程,避免频繁创建/销毁线程。
  • 线程池等待队列默认使用DelayedWorkQueue(一种无界优先队列),大量任务堆积可能导致 OOM。
  • 比 Timer / TimerTask 更安全、更灵活(Timer 是单线程,异常会导致整个调度器崩溃)。若某个任务抛出未捕获异常,该任务将终止,但不会影响其他任务。
  • 可通过 ScheduledFuture.cancel() 取消任务。
  • 调用 shutdown() 关闭线程池后,已提交的任务仍会执行;shutdownNow() 尝试中断正在执行的任务。

线程池最佳实践

  • 避免使用 Executors 创建普通线程池,应显式使用ThreadPoolExecutor
  • 合理设置 corePoolSize 和 maximumPoolSize,根据 CPU 核心数和任务类型(CPU 密集型 vs IO 密集型)调整。
  • 使用有界队列,防止内存溢出。
  • 自定义 ThreadFactory,为线程命名便于排查问题。
  • 合理处理异常:在RunnableCallable中捕获异常,避免线程静默退出。
  • 优雅关闭线程池
executor.shutdown(); if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { executor.shutdownNow(); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 7:52:13

30万字312道高频Java面试题52道场景题总结(附答案)

最近有很多伙伴问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff1b;最近将2年拍成视频面试题文档总结成一份30万字的300道Java高频面试题64道场景题…

作者头像 李华
网站建设 2026/4/22 9:40:22

面试官:谈谈过滤器和拦截器的区别?

一、拦截器和过滤器的区别 1、拦截器(Interceptor)只对action请求起作用 即对外访问路径 而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件 2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行 而过滤器(Filter)是在请求进入Tomcat容器之…

作者头像 李华
网站建设 2026/4/22 21:53:57

YOLOv9-e-Pose发布:人体姿态估计同样依赖GPU加速

YOLOv9-e-Pose发布&#xff1a;人体姿态估计同样依赖GPU加速 在智能制造车间的监控大屏上&#xff0c;一个工人突然弯腰的动作被系统瞬间捕捉——不是简单的“有人移动”&#xff0c;而是精确识别出他正在执行标准作业流程中的“拾取零件”步骤。与此同时&#xff0c;在千里之外…

作者头像 李华
网站建设 2026/4/23 7:23:20

YOLOv8m性能实测:在RTX 4090上达到150FPS

YOLOv8m性能实测&#xff1a;在RTX 4090上达到150FPS在智能制造工厂的质检线上&#xff0c;传送带以每分钟300件的速度飞速运转。传统视觉系统还在处理上一帧图像时&#xff0c;新的工件已经滑过摄像头视野——这种“看得见却来不及检”的窘境&#xff0c;曾是自动化升级的最大…

作者头像 李华
网站建设 2026/4/23 7:52:43

2025最新!自考党必看9个AI论文工具测评,哪款最靠谱?

2025最新&#xff01;自考党必看9个AI论文工具测评&#xff0c;哪款最靠谱&#xff1f; 2025年自考论文工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文工具逐渐成为自考学生提升写作效率、优化论文结构的重要辅助。然而&…

作者头像 李华
网站建设 2026/4/23 9:20:38

学长亲荐10个AI论文工具,助你轻松搞定本科毕业论文!

学长亲荐10个AI论文工具&#xff0c;助你轻松搞定本科毕业论文&#xff01; 论文写作的救星&#xff0c;AI 工具如何改变你的学术之路 在本科毕业论文的撰写过程中&#xff0c;许多同学都会面临时间紧、任务重、思路混乱等难题。而随着 AI 技术的不断成熟&#xff0c;越来越多的…

作者头像 李华