🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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 AsyncPoolConfig { @Bean("customAsyncPool") public Executor asyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //线程核心数 executor.setCorePoolSize(5); //最大线程数 executor.setMaxPoolSize(5); //队列容量大小 executor.setQueueCapacity(500); //线程拒绝策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //线程前缀名称 executor.setThreadNamePrefix("GithubLookup-"); //初始化线程池 executor.initialize(); return executor; } } ``` **2. 注解`@Async("customAsyncPool")`引用自定义的线程池** ```java @Async("customAsyncPool") public void asyncHandle3() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("[asyncHandle3]"); } ``` 如上自定义线程池是全局的,所以以`@Async`,还是以`@Async("customAsyncPool")`所使用的线程池都是自定义的,会覆盖默认的 SimpleAsyncTaskExecutor。