java创建线程池的核心是用threadpoolexecutor显式构造或executors快捷方法,推荐前者以精确控制核心线程数、队列容量、拒绝策略等参数;常见方式包括newfixedthreadpool(固定大小)、newcachedthreadpool(弹性缓存)、newsinglethreadexecutor(单线程串行)及newscheduledthreadpool(定时任务)。

用线程池代替裸线程
每个线程背后都对应操作系统级资源(栈内存、内核调度对象等),频繁新建/销毁代价极高。线程池通过复用固定数量的线程来执行大量任务,避免资源爆炸:
- 固定大小池:`Executors.newFixedThreadPool(8)` —— 适合 CPU 密集型,线程数通常设为 CPU 核心数 ±1
- 弹性缓存池:`Executors.newCachedThreadPool()` —— 适合短时、突发 I/O 任务;空闲 60 秒自动回收线程
- 单线程池:`Executors.newSingleThreadExecutor()` —— 保证串行执行,避免并发冲突
提交任务而非启动线程
不再调用 `thread.start()`,而是把逻辑封装为 `Runnable` 或 `Callable`,交由线程池统一调度:
- `executor.submit(Runnable)`:无返回值,适合纯执行类任务
- `executor.submit(Callable
)`:返回 `Future `,可获取结果或主动取消 - 任务提交后立即返回,线程池内部决定何时、由哪个线程执行
必须显式关闭,否则 JVM 拖尾不退出
线程池默认使用非守护线程,不关闭会导致 JVM 无法正常终止。优雅关闭三步走:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用 `shutdown()`:拒绝新任务,但继续处理已提交任务和队列中等待任务
- 调用 `awaitTermination(timeout, unit)`:阻塞等待所有任务完成,超时则进入下一步
- 必要时调用 `shutdownNow()`:尝试中断正在运行的任务,并返回未开始的任务列表
注意:`shutdownNow()` 不保证任务立即停止,它只是发送中断信号;任务本身需响应 `Thread.interrupted()` 或捕获 `InterruptedException` 才能及时退出。
监控与问题定位不能少
当线程池行为异常(如任务堆积、响应变慢),可通过转型为 `ThreadPoolExecutor` 获取实时指标:
- `((ThreadPoolExecutor) executor).getActiveCount()`:当前正在干活的线程数
- `((ThreadPoolExecutor) executor).getQueue().size()`:排队等待的任务数量
- `((ThreadPoolExecutor) executor).getCompletedTaskCount()`:已完成任务总数
这些数据可接入日志或 Prometheus,帮助判断是否需要调整核心线程数、队列容量或拒绝策略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










