ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
Spring 提供了接口 TaskExecutor,并提供了该接口的一些实现类,如果要自定义线程池,覆盖 Spring 默认的实现类即可。Spring 提供的实现类如下: ```java SimpleAsyncTaskExecutor Spring 默认线程池:该实现不会重用任何线程,每次调用都会创建一个新的线程。 SyncTaskExecutor 该实现不会异步的执行。相反,每次调用都在发起调用的线程中执行。 它的主要用处是在不需要多线程的时候,比如简单的测试用例。 ConcurrentTaskExecutor 该实现是对 Java 5 java.util.concurrent.Executor 类的包装。 有另一个 ThreadPoolTaskExecutor 类更为好用,它暴露了 Executor 的配置参数作为 bean 属性。 ThreadPoolTaskExecutor 该实现最常用、最通用的一种实现。它包含了 java.util.concurrent.ThreadPoolExecutor 的属性, 并且用 TaskExecutor 进行包装。 ``` <br/> 自定义线程池步骤如下: **1. 自定义线程池** ```java @Configuration public class AsyncConfig { @Bean("asyncExecutor") public Executor asyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //线程核心数 executor.setCorePoolSize(5); //最大线程数 executor.setMaxPoolSize(5); //队列容量大小 executor.setQueueCapacity(Integer.MAX_VALUE); //线程拒绝策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //初始化线程池 executor.initialize(); return executor; } } ``` **2. 注解`@Async`引用自定义的线程池** ```java @Slf4j @Service public class AsyncService { @Async public void async01() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("AsyncService -> async01"); } @Async("asyncExecutor") public void async05() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("AsyncService -> async05"); } } ``` 如上自定义线程池是全局的,所以以`@Async`,还是以`@Async("asyncExecutor")`所使用的线程池都是自定义的。