在同一個類中,一個方法調用另外一個有注解(比如@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/