我們在開發中,往往會碰到和多線程相關的問題。我們有時往往需要異步去解決問題,SpringBoot爲我們提供了一個註解,接下來記錄一下。
這裏假設有一個情景,編寫一個service
層的代碼,需要等待3秒的時間,如果是同步的代碼的話,在此過程中,用戶只能等待3秒,期間什麼事都不能做,不管對於系統還是用戶來說,都是不好的。系統那段時間沒有做事,會浪費時間,而用戶等待過程中用戶體驗也不是很好。
這裏先編寫一個小demo代碼:
service:
@Service
public class HelloService {
public void hello(){
try {
Thread.sleep(3000);
System.out.println("處理數據...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
這個代碼作用也是比較簡單,就是在讓系統"沉睡"3秒。接着在寫一個controller
去調用它:
controller:
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@GetMapping("hello")
public String hello(){
String hello = helloService.hello();
return "hello world";
}
}
我們在瀏覽器訪問該路徑時,需要等待3秒纔可以有結果。這就會像我們上文提到的一樣,我們這時就會想到用異步的方式去解決它,如果自己編寫異步代碼那挺麻煩的(當時學多線程的噩夢…),好在SpringBoot爲我們提供了一個註解(@Async
),我們只需要把該註解標註在需要的方法即可。
@Async
之後,還差一步,我們是標註了異步註解,但是還要去開啓異步的相關支持,需要在主啓動類中添加:
#EnableAsync //表示開啓異步的相關支持
之後再次訪問路徑,就無需等待,便可直接訪問:
這個註解平時應用場景挺多的,比如給用戶發送郵件,推送消息等等。就無需一步一步做了,可以同時執行。