使用异步开启新的线程Spring异步方法注解@Async
在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的。
特别注意的地方:
- 在调用@Async方法的类后面添加注解: @EnableAsync
- 在被调用的方法增加@Async注解
- 调用和被调用, 不能在一个类里面定义, 要分开定义.
- 方法所属的类的对象需要是被Spring容器所管理的,也就是指被@Controller @Service @Repository @Component这些注解的类
- 我们不关心方法的返回值
- 方法的返回值为void
- 通过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/
春有百花秋有月,夏有凉风冬有雪!