赞
踩
ThreadPoolExecutor
是Java中用于管理线程池的类,它提供了一个灵活且可配置的线程池,可以有效地执行并管理多个任务。使用ThreadPoolExecutor
可以实现线程的复用、线程池大小的控制、任务调度和异常处理等功能。
当使用new
关键字去创建ThreadPoolExecutor
类型的对象时,相关的构造函数定义如下:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.acc = System.getSecurityManager() == null ? null : AccessController.getContext(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }
corePoolSize
(核心线程数):
prestartCoreThread()
方法,核心线程会提前启动。maximumPoolSize
(最大线程数):
什么是等待队列?
等待队列是在线程池中用于存储无法立即执行的任务的队列。当线程池中的线程数已达到最大线程数时,新提交的任务会被放入等待队列中等待执行。等待队列可以采用不同的实现,如
ArrayBlockingQueue
、LinkedBlockingQueue
、SynchronousQueue
等。如果等待队列已满,并且线程池中的线程数已达到最大线程数,那么线程池会根据预定义的拒绝策略来处理新提交的任务。
keepAliveTime
(线程空闲时间):
keepAliveTime
时,线程会被终止,直到线程数量等于核心线程数。unit
(时间单位):
keepAliveTime
参数的时间单位,可以是TimeUnit.MILLISECONDS
(毫秒)、TimeUnit.SECONDS
(秒)等。workQueue
(工作队列):
ThreadPoolExecutor
提供了多种实现类,如ArrayBlockingQueue
、LinkedBlockingQueue
、SynchronousQueue
等。threadFactory
(线程工厂):
handler
(拒绝策略):
ThreadPoolExecutor
提供了多种预定义的拒绝策略,如AbortPolicy
、CallerRunsPolicy
、DiscardPolicy
、DiscardOldestPolicy
等。
Java中的
ThreadPoolExecutor
类提供了哪些预定义的拒绝策略?
AbortPolicy
(默认):如果等待队列已满且线程池中的线程数已达到最大线程数,新提交的任务会立即抛出
RejectedExecutionException
异常,阻止任务的执行。
CallerRunsPolicy
:如果等待队列已满且线程池中的线程数已达到最大线程数,新提交的任务会由调用线程直接执行,而不会启动新的线程。
DiscardPolicy
:如果等待队列已满且线程池中的线程数已达到最大线程数,新提交的任务会被默默地丢弃,不会抛出异常,也不会执行。
DiscardOldestPolicy
:如果等待队列已满且线程池中的线程数已达到最大线程数,新提交的任务会尝试替换等待队列中最早的任务(即队头任务),然后重新提交新任务。
public static void main(String[] args) {
// 创建ThreadPoolExecutor
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,
10, 5000,
TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
// 提交任务给线程池执行
for (int i = 0; i < 20; i++) {
// 创建任务对象
Runnable task = () -> System.out.println(Thread.currentThread().getName() + ":任务执行啦");
threadPoolExecutor.execute(task);
}
// 关闭线程池
threadPoolExecutor.shutdown();
}
结果记录:
pool-1-thread-2:任务执行啦 pool-1-thread-3:任务执行啦 pool-1-thread-5:任务执行啦 pool-1-thread-1:任务执行啦 pool-1-thread-4:任务执行啦 pool-1-thread-5:任务执行啦 pool-1-thread-3:任务执行啦 pool-1-thread-2:任务执行啦 pool-1-thread-5:任务执行啦 pool-1-thread-4:任务执行啦 pool-1-thread-1:任务执行啦 pool-1-thread-1:任务执行啦 pool-1-thread-1:任务执行啦 pool-1-thread-1:任务执行啦 pool-1-thread-4:任务执行啦 pool-1-thread-4:任务执行啦 pool-1-thread-5:任务执行啦 pool-1-thread-2:任务执行啦 pool-1-thread-3:任务执行啦 pool-1-thread-1:任务执行啦
/** * 线程池 * * @Author: Isabener * @Date: 2023/5/28 11:04:58 */ @Configuration public class TaskPoolConfig { @Bean(name = "passionAsyncExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(7); executor.setMaxPoolSize(15); executor.setQueueCapacity(50); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("passion-asyns-executor-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } }
/**
* 注:该方法所在类需要被Spring所管理
*/
@Async("passionAsyncExecutor")
public void test() {
//业务逻辑
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。