springboot中的线程池

1.springboot线程池定时任务类org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler

参考springboot线程池任务调度类 – ThreadPoolTaskScheduler介绍 - toiletgg - 博客园

ThreadPoolTaskScheduler其实底层使用也是java自带的线程池,相比于通过java自带的周期性任务线程池ScheduleThreadPoolExecutor,此bean对象支持根据cron表达式创建周期性任务。

当在启动类添加@EnableScheduling注解,启动时会默认创建ThreadPoolTaskScheduler类,但默认线程池只有1,可以自己手动创建,那会覆盖框架自动创建的类。

@Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(2);//我这里设置的线程数是2,可以根据需求调整
        return taskScheduler;
    }

方法如下

org.springframework.scheduling.TaskScheduler#schedule(java.lang.Runnable, java.time.Instant),是延迟执行一次

org.springframework.scheduling.TaskScheduler#schedule(java.lang.Runnable, org.springframework.scheduling.Trigger)是cron表达式定时执行

参考动态创建线程池:SpringBoot设置动态定时任务_wl_Honest的博客-优快云博客_springboot动态定时任务

2.springboot线程池非定时任务类ThreadPoolTaskExecutor

参考:@EnableAsync@Async使用总结 - 在贝加尔湖畔 - 博客园

我们在使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要来创建Executors,在使用spring中,已经给我们做了很好的支持。只要要@EnableAsync就可以使用多线程。使用@Async就可以定义一个线程任务。通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池。

@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
	
	private static final int corePoolSize = 10;       		// 核心线程数(默认线程数)
	private static final int maxPoolSize = 100;			    // 最大线程数
	private static final int keepAliveTime = 10;			// 允许线程空闲时间(单位:默认为秒)
	private static final int queueCapacity = 200;			// 缓冲队列数
	private static final String threadNamePrefix = "Async-Service-"; // 线程池名前缀
	
	@Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
	public ThreadPoolTaskExecutor getAsyncExecutor(){
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setCorePoolSize(corePoolSize);   
		executor.setMaxPoolSize(maxPoolSize);
		executor.setQueueCapacity(queueCapacity);
		executor.setKeepAliveSeconds(keepAliveTime);
		executor.setThreadNamePrefix(threadNamePrefix);
		
		// 线程池对拒绝任务的处理策略
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		// 初始化
		executor.initialize();
		return executor;
	}
}
### Spring Boot线程池的配置与使用 #### 自动配置线程池 Spring Boot 提供了 `@EnableAsync` 注解来启用异步方法执行的支持。默认情况下,当启用了该注解时,会创建一个基于 Java 的 `SimpleAsyncTaskExecutor` 来处理所有的异步调用[^1]。 为了更高效地管理和控制并发任务,建议自定义线程池替代默认实现: ```java @Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(7); executor.setMaxPoolSize(42); executor.setQueueCapacity(100); executor.initialize(); return executor; } } ``` 这段代码展示了如何通过继承 `AsyncConfigurer` 接口并重写 `getAsyncExecutor()` 方法来自定义线程池设置,包括核心线程数、最大线程数以及队列容量等重要属性[^3]。 #### 使用自定义线程池执行异步任务 一旦完成了上述配置,在业务逻辑层可以通过简单地标记某个方法为 `async` 关键字的方式将其变为异步运行的方法: ```java @Service public class MyService { @Async public CompletableFuture<Void> performTask(Long id) throws InterruptedException { System.out.println("Processing task " + id +" on thread "+Thread.currentThread().getName()); Thread.sleep(id * 100); // Simulate work being done. return CompletableFuture.completedFuture(null); } } ``` 这里展示了一个服务类中的异步方法例子,它接受一个长时间运行的任务模拟,并返回一个 `CompletableFuture` 对象以便后续链式调用或其他组合操作[^2]。 #### 监控和管理线程池 除了基本的功能外,还可以借助 Actuator 和 Micrometer 等工具对线程池的状态进行监控,比如当前活动线程数量、已完成任务总数等指标。这有助于及时发现潜在瓶颈并对性能做出相应调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值