使用异步开启新的线程Spring异步方法注解@Async

  在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的。

  特别注意的地方:

  1.  在调用@Async方法的类后面添加注解: @EnableAsync
  2.  在被调用的方法增加@Async注解
  3.  调用和被调用, 不能在一个类里面定义, 要分开定义.
  4.  方法所属的类的对象需要是被Spring容器所管理的,也就是指被@Controller @Service @Repository @Component这些注解的类  

 

 

  

  1. 我们不关心方法的返回值
  2. 方法的返回值为void
  3. 通过Future对象异步地获得返回值

  Future接口的四个方法

// 取消任务 boolean cancel(boolean mayInterruptIfRunning);

// 判断任务是否已取消 boolean isCancelled();

// 判断任务是否已结束 boolean isDone();

// 获得任务执行结果 get();

// 获得任务执行结果,支持超时 get(long timeout, TimeUnit unit);

利用 Java 并发包提供的 Future 可以很容易获得异步任务的执行结果,无论异步任务是通过线程池 ThreadPoolExecutor 执行的,还是通过手工创建子线程来执行的。Future 可以类比为现实世界里的提货单,比如去蛋糕店订生日蛋糕,蛋糕店都是先给你一张提货单,你拿到提货单之后,没有必要一直在店里等着,可以先去干点其他事,比如看场电影;等看完电影后,基本上蛋糕也做好了,然后你就可以凭提货单领蛋糕了。

  利用多线程可以快速将一些串行的任务并行化,从而提高性能;如果任务之间有依赖关系,比如当前任务依赖前一个任务的执行结果,这种问题基本上都可以用 Future 来解决。在分析这种问题的过程中,建议你用有向图描述一下任务之间的依赖关系,同时将线程的分工也做好,类似于烧水泡茶最优分工方案那幅图。对照图来写代码,好处是更形象,且不易出错

https://blog.csdn.net/pizicai007/article/details/107134991/

 

posted @ 2020-11-10 16:04  逝年的我们  阅读(746)  评论(0编辑  收藏  举报