在Java并发编程中,线程池是管理线程的利器。它通过复用线程、减少线程创建和销毁的开销,显著提升了系统性能和资源利用率。Java的java.util.concurrent
包提供了强大的线程池支持,尤其是ThreadPoolExecutor
类,它是实现线程池的核心。
LinkedBlockingQueue
和ArrayBlockingQueue
。以下是一个典型的线程池创建示例:
ExecutorService executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 线程空闲时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(100), // 工作队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
CPU核心数 + 1
。CPU核心数 * 2
。ArrayBlockingQueue
)限制队列大小。CallerRunsPolicy
,让提交任务的线程直接执行任务。shutdown()
方法平滑关闭线程池。awaitTermination()
方法等待任务执行完毕。executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
通过监控线程池的运行状态,动态调整核心线程数和最大线程数,以适应不同的负载情况。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
// 动态调整核心线程数
executor.setCorePoolSize(10);
executor.setMaximumPoolSize(20);
根据业务需求选择合适的拒绝策略:
通过监控线程池的运行状态,可以及时发现和解决问题。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
// 监控线程池状态
ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();
monitor.scheduleAtFixedRate(() -> {
System.out.println("Active Threads: " + executor.getActiveCount());
System.out.println("Completed Tasks: " + executor.getCompletedTaskCount());
System.out.println("Queue Size: " + executor.getQueue().size());
}, 0, 1, TimeUnit.SECONDS);
通过自定义线程工厂,可以为线程设置更有意义的名称和优先级。
ThreadFactory threadFactory = r -> {
Thread thread = new Thread(r);
thread.setName("CustomThread-" + thread.getId());
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
};
ExecutorService executor = new ThreadPoolExecutor(
5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), threadFactory
);
在一个电商系统中,订单处理服务使用线程池处理订单创建请求。在高并发场景下,线程池出现任务堆积和响应时间过长的问题。
CPU核心数 * 2
(IO密集型任务)。CPU核心数 * 4
。CallerRunsPolicy
,让提交任务的线程执行任务。ThreadPoolExecutor executor = new ThreadPoolExecutor(
8, // 核心线程数
16, // 最大线程数
60, // 线程空闲时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(1000), // 有界队列
new ThreadFactory() {
private final AtomicInteger counter = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "OrderThread-" + counter.getAndIncrement());
}
},
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
线程池是Java并发编程中的重要工具,合理配置和优化线程池可以显著提升系统性能。在实际开发中,需要根据业务场景动态调整线程池参数,并结合监控工具及时发现和解决问题。通过不断学习和实践,我们可以更好地掌握线程池的使用技巧,为高并发系统提供强有力的支持。