除了应用默认线程池外,能够自定义应用的线程池(举荐)
定义线程池
第一步,先在Spring Boot主类中定义一个线程池,比方:
@EnableAsync @Configuration class TaskPoolConfig { @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(200); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("taskExecutor-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } }
下面咱们通过应用ThreadPoolTaskExecutor创立了一个线程池,同时设置了以下这些参数:
- 外围线程数10:线程池创立时候初始化的线程数
- 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过外围线程数的线程
- 缓冲队列200:用来缓冲执行工作的队列
- 容许线程的闲暇工夫60秒:当超过了外围线程出之外的线程在闲暇工夫达到之后会被销毁
- 线程池名的前缀:设置好了之后能够不便咱们定位解决工作所在的线程池
- 线程池对回绝工作的解决策略:这里采纳了CallerRunsPolicy策略,当线程池没有解决能力的时候,该策略会间接在 execute 办法的调用线程中运行被回绝的工作;如果执行程序已敞开,则会抛弃该工作
- 在定义了线程池之后,咱们如何让异步调用的执行工作应用这个线程池中的资源来运行呢?办法非常简单,咱们只须要在@Async注解中指定线程池名即可,比方:
@Slf4j@Componentpublic class Task { public static Random random = new Random(); @Async("taskExecutor") public void doTaskOne() throws Exception { log.info("开始做工作一"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); log.info("实现工作一,耗时:" + (end - start) + "毫秒"); } @Async("taskExecutor") public void doTaskTwo() throws Exception { log.info("开始做工作二"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); log.info("实现工作二,耗时:" + (end - start) + "毫秒"); } @Async("taskExecutor") public void doTaskThree() throws Exception { log.info("开始做工作三"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); log.info("实现工作三,耗时:" + (end - start) + "毫秒"); }}
单元测试
最初,咱们来写个单元测试来验证一下
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTestpublic class ApplicationTests { @Autowired private Task task; @Test public void test() throws Exception { task.doTaskOne(); task.doTaskTwo(); task.doTaskThree(); //join办法的作用是阻塞,即期待线程完结,才继续执行。 Thread.currentThread().join(); }}