线程池在之间的文章中已经解释
ThreadPoolExecutor
(java.util.concurrent.ThreadPoolExecutor):
ThreadPoolExecutor
是 Java 标准库中提供的线程池实现类,位于java.util.concurrent
包下。- 使用
ThreadPoolExecutor
可以创建自定义的线程池,具有高度的灵活性,可以通过构造函数传递各种参数,如核心线程数、最大线程数、工作队列类型、拒绝策略等。 - 提供了丰富的配置选项,但需要手动配置
ThreadPoolTaskExecutor
(org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor):
ThreadPoolTaskExecutor
是 Spring 框架中提供的线程池实现类,位于org.springframework.scheduling.concurrent
包下。ThreadPoolTaskExecutor
是对ThreadPoolExecutor
的封装,提供了更多的配置选项,并且更易于使用。- 集成了 Spring 的事务管理和异步任务执行等特性,适用于 Spring 项目
这里采用ThreadPoolTaskExecutor
创建线程池
@Configuration
public class TaskExecutorConfig {
@Bean("taskExecutor")
public TaskExecutor getAsyncExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数,线程池创建时初始化线程数
executor.setCorePoolSize(9);
// 设置最大线程数,只有缓冲队列满了以后,才会申请超出核心线程数的线程
executor.setMaxPoolSize(10);
// 设置队列容量 缓冲队列
executor.setQueueCapacity(200);
// 设置线程活跃时间(秒) ,当超过了核心线程之外的线程,在空闲时间到达之后就会被销毁
executor.setKeepAliveSeconds(60);
//该方法用来设置线程池关闭的时候等待所有任务都完成后,在继续销毁其他的bean,这样这些异步任务销毁就会先于数据库连接池对象的销毁
executor.setWaitForTasksToCompleteOnShutdown(true);
// 设置拒绝策略,采用CallerRunsPolicy策略,当线程池没有处理能力的时候,
// 该策略会直接在executor方法的调用线程中运行被拒绝的任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
//该方法用来设置线程池中,任务的等待时间,如果超过这个时间还没有被销毁就 强制销毁,
//以确保应用最后能够被关闭,而不是阻塞
executor.setAwaitTerminationSeconds(60);
return executor;
}
}
线程的调用
public class CountDownLatchExample {
@Resource
private TaskExecutor taskExecutor;
public static void main(String[] args) {
int numThreads = 3;
CountDownLatch latch = new CountDownLatch(numThreads);
for (int i = 0; i < numThreads; i++) {
taskExecutor.excute(() -> {
// Simulate some task
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Task completed, countdown the latch
latch.countDown();
}).start();
}
try {
latch.await(); // Main thread waits for all tasks to complete
System.out.println("All tasks completed!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CountDownLatch
是一种同步工具,用于在多线程环境中协调线程的执行顺序。它允许一个或多个线程等待其他线程完成操作。