Spring Boot利用@Async怎样实现异步调用:自定义线程池

发布时间:2021-02-20 10:48:46 作者:小新
来源:亿速云 阅读:182

小编给大家分享一下Spring Boot利用@Async怎样实现异步调用:自定义线程池,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

定义线程池

第一步,先在Spring Boot主类中定义一个线程池,比如:

@SpringBootApplication
public class Application {
 public static void main(String[] args) {
  SpringApplication.run(Application.class, args);
 }

 @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创建了一个线程池,同时设置了以下这些参数:

使用线程池

在定义了线程池之后,我们如何让异步调用的执行任务使用这个线程池中的资源来运行呢?方法非常简单,我们只需要在@Async注解中指定线程池名即可,比如:

@Slf4j
@Component
public 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)
@SpringBootTest
public class ApplicationTests {
 @Autowired
 private Task task;
 @Test
 public void test() throws Exception {
  task.doTaskOne();
  task.doTaskTwo();
  task.doTaskThree();
  Thread.currentThread().join();
 }
}

执行上面的单元测试,我们可以在控制台中看到所有输出的线程名前都是之前我们定义的线程池前缀名开始的,说明我们使用线程池来执行异步任务的试验成功了!

2018-03-27 22:01:15.620  INFO 73703 --- [ taskExecutor-1] com.didispace.async.Task                 : 开始做任务一
2018-03-27 22:01:15.620  INFO 73703 --- [ taskExecutor-2] com.didispace.async.Task                 : 开始做任务二
2018-03-27 22:01:15.620  INFO 73703 --- [ taskExecutor-3] com.didispace.async.Task                 : 开始做任务三
2018-03-27 22:01:18.165  INFO 73703 --- [ taskExecutor-2] com.didispace.async.Task                 : 完成任务二,耗时:2545毫秒
2018-03-27 22:01:22.149  INFO 73703 --- [ taskExecutor-3] com.didispace.async.Task                 : 完成任务三,耗时:6529毫秒
2018-03-27 22:01:23.912  INFO 73703 --- [ taskExecutor-1] com.didispace.async.Task                 : 完成任务一,耗时:8292毫秒

以上是“Spring Boot利用@Async怎样实现异步调用:自定义线程池”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. 详解Spring Boot如何使用多线程
  2. Spring中@Async注解如何实现异步调用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot @async

上一篇:Pycharm如何制作搞怪弹窗

下一篇:怎么用Matlab和Python读取Netcdf文件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》