一、概念
Java线程池在开发中是一种常用的并发工具,用于管理和复用
线程,提高系统的性能
和资源利用率
。线程池包含一个线程队列
和一组管理线程
的方法,可以根据需要动态调整线程数量
,避免频繁创建和销毁线程的开销,提高系统的响应速度
和并发能力
。
二、优势
线程池的优势体现在以下几个方面:
-
复用线程
: 减少线程创建和销毁的开销。通过维护一定数量的核心线程,线程池可以在接收到任务时直接分配线程执行,避免频繁创建线程的性能损耗。 -
控制线程数量
: 线程池可以控制并发线程数量
,避免系统资源耗尽。通过设置最大线程数和工作队列大小等参数,线程池可以限制同时执行的线程数量,防止系统负载过高导致性能下降
或系统崩溃
。 -
提高性能
: 线程池可以提高性能,降低系统资源消耗。通过合理调整线程池参数
,可以更好地利用系统资源,提高任务执行的效率和整体系统的响应速度。
三、常用参数
线程池的参数对线程池的性能,可以使用这些参数对线程池进行整体调优,以提高线程池的工作效率,提供系统的响应性能。
-
核心线程数(corePoolSize)
:核心线程数是线程池中保持活动的线程数,即使线程处于空闲状态
也不会被回收。当有新任务到来时,线程池会优先使用核心线程
来处理任务。核心线程数的设置应该根据系统的负载情况和任务特性来确定,过少会导致任务等待时间过长,过多则会增加系统开销。 -
最大线程数(maximumPoolSize)
:最大线程数是线程池中允许的最大线程数量,当任务量超过核心线程数且工作队列已满时
,线程池会创建新的线程来处理任务。最大线程数的设置应该考虑系统资源限制和负载情况,过高的最大线程数可能导致系统资源耗尽。 -
线程存活时间(keepAliveTime)
:线程存活时间是非核心线程的空闲线程在被回收之前保持存活的时间。当线程池中线程数量超过核心线程数
时,多余的线程在空闲一段时间后会被回收。通过设置线程存活时间,可以控制线程池中线程数量的动态调整
。
4. 工作队列(workQueue)
:工作队列用于存储等待执行的任务,当线程池中的线程数量达到核心线程数时
,新任务会被放入工作队列中等待执行。不同类型的工作队列(如ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等)对线程池的性能和行为有着不同的影响。
下面使用一个自定义参数的线程池,代码如下:
import java.util.concurrent.*;
public class CustomThreadPoolExample {
public static void main(String[] args) {
int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 5000;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
keepAliveTime,
TimeUnit.MILLISECONDS,
workQueue
);
// 提交任务给线程池执行
for (int i = 0; i < 20; i++) {
threadPool.execute(() -> {
System.out.println("Task executed by thread: " + Thread.currentThread().getName());
});
}
// 关闭线程池
threadPool.shutdown();
}
}
四、工作原理
Java线程池的工作原理是:当线程池接收到任务
时,首先判断当前活动线程数是否小于
核心线程数,如果是,则创建新线程执行任务
;如果活动线程数达到核心线程数,则将任务加入工作队列
;如果工作队列已满且活动线程数未达到最大线程数
,则创建新线程执行任务;如果工作队列已满且活动线程数已达到最大线程数
,则根据线程池的拒绝策略处理任务
。