ThreadPoolExecutor的7个参数
- 核心线程数,
- 最大线程数,
- 最大空闲时间,
- 时间单位,
- 阻塞队列,
- 线程工厂,
- 拒绝策略。
下面是对 ThreadPoolExecutor
的七个参数的详细解释:
- 核心线程数(corePoolSize):
核心线程数是线程池中保持活动状态的线程数。即使没有任务需要执行,核心线程也不会被回收。当有新任务提交时,如果核心线程都在忙碌,则会创建新的线程来处理任务。 - 最大线程数(maximumPoolSize):
最大线程数是线程池中允许的最大线程数。当工作队列满了并且活动线程数达到最大线程数时,如果还有新任务提交,线程池将创建新的线程来处理任务。但是,超过最大线程数的线程可能会导致资源消耗过大。 - 空闲线程存活时间(keepAliveTime):
空闲线程存活时间指的是非核心线程在没有任务执行时的最长存活时间。当线程池中的线程数超过核心线程数且空闲时间达到设定值时,多余的线程将被终止,直到线程池中的线程数不超过核心线程数。 - 时间单位(unit):
时间单位是用于表示核心线程数和空闲线程存活时间的单位。常见的时间单位包括秒、毫秒、分钟等。 - 工作队列(workQueue):
工作队列用于存储待执行的任务。当线程池中的线程都在忙碌时,新提交的任务将被添加到工作队列中等待执行。常见的工作队列类型有有界队列(如ArrayBlockingQueue
)和无界队列(如LinkedBlockingQueue
)等。 - 线程工厂(threadFactory):
线程工厂用于创建新线程。线程工厂提供了创建线程的方法,可以自定义线程的名称、优先级等属性。 - 拒绝策略(rejectedExecutionHandler):
拒绝策略定义了当线程池无法接受新任务时的处理策略。当工作队列已满且线程池中的线程数已达到最大线程数时,新任务将被拒绝执行。常见的拒绝策略有丢弃、丢弃最旧的任务、抛出异常等。
这些参数可以根据应用程序的需求进行调整,以平衡性能和资源消耗。通过合理地配置这些参数,可以优化线程池的性能和资源利用率。
示例代码
下面是一个使用 Java 的 ThreadPoolExecutor
演示七个参数的示例程序:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorExample {
public static void main(String[] args) {
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
60, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(10), // 工作队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
// 提交任务
for (int i = 1; i <= 15; i++) {
final int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " is running. Thread: " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 关闭线程池
executor.shutdown();
}
}
在这个示例中,我们使用 ThreadPoolExecutor
创建了一个线程池,然后提交了15个任务。这里的参数如下:
- 核心线程数:2(
corePoolSize
) - 最大线程数:4(
maximumPoolSize
) - 空闲线程存活时间:60秒(
keepAliveTime
) - 时间单位:秒(
TimeUnit.SECONDS
) - 工作队列:使用大小为10的有界队列(
ArrayBlockingQueue
) - 线程工厂:使用默认的线程工厂(
Executors.defaultThreadFactory()
) - 拒绝策略:使用默认的拒绝策略,即丢弃被拒绝的任务并抛出异常(
ThreadPoolExecutor.AbortPolicy()
)
你可以运行这个示例程序,观察线程池的行为并了解这七个参数的作用。请注意,具体的输出结果可能因系统和运行环境的不同而有所差异。