为什么需要线程池?
在并发编程中,频繁创建和销毁线程会消耗大量系统资源。线程池通过复用已有线程,有效控制并发数量,减少创建开销,提高响应速度,同时提供更强大的线程管理功能。
线程池核心参数解析
Java中的ThreadPoolExecutor构造函数包含7个关键参数:
- corePoolSize:核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:线程空闲时间
- unit:时间单位
- workQueue:任务队列
- threadFactory:线程工厂
- handler:拒绝策略
四种拒绝策略
当任务过多时,线程池会启动拒绝策略:
- AbortPolicy:默认策略,直接抛出异常
- CallerRunsPolicy:用调用者线程执行任务
- DiscardPolicy:直接丢弃任务
- DiscardOldestPolicy:丢弃队列中最老的任务
实战代码示例
import java.util.concurrent.*;
public class ThreadPoolDemo {
public static void main(String[] args) {
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
5, // 最大线程数
60, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(10), // 任务队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
// 提交任务
for (int i = 0; i < 15; i++) {
final int taskId = i;
executor.execute(() -> {
System.out.println("执行任务:" + taskId + ",线程名:" + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 关闭线程池
executor.shutdown();
}
}
Executors工具类快捷创建
Java提供了Executors工具类快速创建线程池:
- newFixedThreadPool:固定大小线程池
- newCachedThreadPool:可缓存线程池
- newSingleThreadExecutor:单线程线程池
总结
线程池是Java并发编程的核心组件,合理配置参数对系统性能至关重要。实际开发中应根据任务特性(CPU密集型/IO密集型)选择合适的线程池类型和参数,避免使用Executors快捷方法导致的潜在问题,推荐直接使用ThreadPool构造函数创建线程池,以获得更好的可控性和性能表现。
1万+

被折叠的 条评论
为什么被折叠?



