线程
一、概述
TioThreadUtils 是一个基于 java.util.concurrent.ExecutorService 封装的线程池工具类,用于在项目中统一管理和使用线程池资源。 它提供了:
- 全局唯一的固定大小线程池
- 统一的线程命名规则
- 简化的任务提交与执行方法
- 线程池的启动、停止与重启能力
适用于异步任务执行、并发处理、后台任务等场景。
二、线程池特性
1. 线程池类型
- FixedThreadPool(固定大小线程池)
- 线程数量计算规则:
int nThreads = max(16, CPU核心数 × 4)
确保在高并发场景下有足够的线程处理任务。
2. 线程命名规则
线程名称格式:
tio-utils-1
tio-utils-2
tio-utils-3
...
优点:
- 便于日志分析
- 方便排查线程问题
- 提升运维和调试效率
3. 生命周期管理
类加载时自动调用
start()初始化线程池支持手动:
- 启动(start)
- 停止(stop)
- 重启(restart)
三、基本使用方法
1. 获取线程池实例
ExecutorService executorService = TioThreadUtils.getFixedThreadPool();
适用于需要直接操作 ExecutorService 的场景。
2. 提交 Runnable 任务(无返回值)
TioThreadUtils.submit(() -> {
System.out.println("执行异步任务");
});
返回值:
Future<?> future
3. 提交 Runnable 任务(带返回结果)
Future<String> future = TioThreadUtils.submit(() -> {
System.out.println("执行任务");
}, "success");
String result = future.get(); // 返回 "success"
4. 提交 Callable 任务(有返回值)
Future<Integer> future = TioThreadUtils.submit(() -> {
// 业务逻辑
return 100;
});
Integer result = future.get();
适用于需要计算结果或捕获异常的任务。
5. 直接执行任务(execute)
TioThreadUtils.execute(() -> {
System.out.println("直接执行任务");
});
说明:
- 不返回
Future - 适合“只执行、不关心结果”的任务
四、线程池控制方法
1. 启动线程池
TioThreadUtils.start();
说明:
- 默认在类加载时已自动调用
- 一般无需手动调用,除非曾调用过
stop()
2. 停止线程池
TioThreadUtils.stop();
行为:
- 调用
shutdownNow() - 尝试中断所有正在执行的任务
- 将线程池引用置为
null
注意事项:
- 停止后不可再提交任务
- 再次使用前必须调用
start()或restart()
3. 重启线程池
TioThreadUtils.restart();
等价于:
TioThreadUtils.stop();
TioThreadUtils.start();
适用场景:
- 系统重载
- 配置热更新
- 异常恢复
五、使用建议与注意事项
1. 推荐使用场景
- IO 密集型任务
- 异步业务处理
- 后台任务执行
- 并发请求处理
2. 注意事项
- 不建议在任务中执行长时间阻塞操作(如无限等待)
- 提交任务前确保线程池未被
stop() - 任务内部异常应自行捕获,避免影响线程复用
- 不适合对线程数量、队列策略有特殊要求的场景
六、示例:典型使用场景
public class OrderService {
public void asyncCreateOrder() {
TioThreadUtils.submit(() -> {
// 创建订单
// 发送消息
// 写日志
});
}
}
七、总结
TioThreadUtils 提供了一种 简单、统一、可控 的线程池使用方式,适合在项目中作为默认的异步执行工具类。 通过合理使用,可以有效提升系统并发能力和代码可维护性。
如需更复杂的线程池策略(如队列控制、拒绝策略、动态扩容),可在此基础上进行扩展。
