ThreadPoolExecutor
是Java中用于管理线程池的类,它实现了ExecutorService
接口。它提供了一种灵活且可配置的方式来管理线程的创建、使用和销毁,以支持并发任务执行。ThreadPoolExecutor
允许您在应用程序中维护一个线程池,以便可以重复利用线程,避免频繁地创建和销毁线程,从而提高了执行任务的效率。
以下是ThreadPoolExecutor
类的构造函数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue);
这些参数的含义如下:
corePoolSize
: 线程池的核心线程数。在线程池创建时,它将始终保留这么多的线程在活动状态,即使它们处于空闲状态。如果任务数量小于核心线程数,线程池不会创建多余的线程。maximumPoolSize
: 线程池的最大线程数。当线程池中的线程数达到核心线程数时,如果任务继续增加,线程池会创建新的线程,直到线程数达到最大线程数为止。如果任务数量超过最大线程数,并且工作队列也已满,新的任务将根据配置的饱和策略来处理。keepAliveTime
: 空闲线程的最大存活时间。当线程池中的线程数大于核心线程数且有空闲线程时,空闲线程会等待一段时间,如果在该时间内没有新的任务提交,那么空闲线程会被销毁,以减少资源消耗。unit
: keepAliveTime参数的时间单位。workQueue
: 用于存储待执行任务的阻塞队列。线程池会从该队列中取出任务并执行。
除了构造函数外,ThreadPoolExecutor
还提供了一些其他方法来管理线程池,例如增加或减少核心线程数、预启动核心线程、设置饱和策略等。
以下是一个简单的示例,展示了如何使用ThreadPoolExecutor
:
import java.util.concurrent.*;
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
int corePoolSize = 2;
int maximumPoolSize = 5;
long keepAliveTime = 60; // 60 seconds
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
TimeUnit.SECONDS,
workQueue
);
for (int i = 1; i <= 10; i++) {
int taskNumber = i;
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println("Executing task " + taskNumber + " on thread " + Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
executor.shutdown();
}
}
在这个示例中,我们创建了一个核心线程数为2,最大线程数为5,存活时间为60秒的ThreadPoolExecutor
。然后,我们提交了10个任务给线程池执行。由于核心线程数为2,线程池会创建2个线程并立即执行前两个任务。剩余的8个任务会被放入阻塞队列中等待执行。随着任务的执行,线程池会根据需要创建新的线程,直到达到最大线程数为止。在示例中,我们模拟了每个任务执行2秒钟的耗时操作。
注意:在实际应用中,对于线程池的参数选择需要根据具体的业务场景和系统资源来进行合理的调整。合理配置线程池可以避免资源的浪费和性能的下降。