三豐 soft張三丰 java
異步處理就是按照不一樣步的程序處理問題。異步處理與同步處理是對立的,而產生他們的是多線程或者多進程。異步處理的好處就是提升設備使用率,從而在宏觀上提高程序運行效率,可是弊端就是容易出現衝突操做和數據髒讀。同步則恰好相反,同步是一種下降設備使用率,在宏觀上下降了程序的運行效率,並且不少系統或者是運行環境在處理同步的時候爲了維持同步的有效性也會付出許多格外的系統資源開支,對性能影響至關大。可是同步保證了程序運行的正確性與數據的完整性。
數據庫
學習 SpringBoot 異步執行方法 以前咱們先看一個同步執行的例子。多線程
首先是一個 Service 類:TestAsyncService.java,這裏只是爲了演示,就沒有訪問數據庫和編寫接口。app
@Service public class TestAsyncService { public String getResult() { System.out.println("getResult() start..."); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("getResult() end..."); return "TestAsync"; } }
而後一個 Controller 類 :TestAsyncController , 調用 TestAsyncService 以下所示 。異步
@EnableAutoConfiguration @RestController public class TestAsyncController { @Autowired TestAsyncService testAsyncService; @RequestMapping("/testAsyncController") public String testAsyncController() { String result; System.out.println("testAsyncController() start..."); result = testAsyncService.getResult(); System.out.println("testAsyncController() end..."); return "結果:" + result; } }
從新啓動工程,訪問:http://localhost:8080/testAsyncController。ide
他會現有 3 秒 的卡頓,卡頓是由於 TestAsyncService。
而後出現結果:
四條輸出語句以下所示:
性能
SpringBoot 異步執行方法原理是建立了一個新的線程去運行 service 的方法,這會致使 controller 已經執行完成,而 service 還在運行,固然 controller 獲取不到 service 的執行結果。使用到的註解是 @Async 。學習
第一步:修改啓動類,須要添加@EnableAsync 這個註解開啓異步調用。線程
// 啓動類上加上@SpringBootApplication註解,當前包下或者子包下全部的類均可以掃到 @SpringBootApplication // @EnableAsync 開啓異步調用 @EnableAsync public class SpringbootStudy01Application { public static void main(String[] args) { SpringApplication.run(SpringbootStudy01Application.class, args); } }
第二步:@Async 註解修飾 TestAsyncService,以下所示。3d
@Service public class TestAsyncService { @Async public String getResult() { System.out.println("getResult() start..."); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("getResult() end..."); return "TestAsync"; } }
TestAsyncController 不需修改,從新啓動工程,訪問 : http://localhost:8080/testAsyncController 。
運行截圖以下所示:
顯然,controller 已經執行完成,而 service 還在運行。