相信這個時代,大家在操作應用程式,特別是web的時候,都無法忍受慢個1、2秒的時間,因此,提升效能跟減少響應時間是非常重要的,而Spring Boot的非同步處理機制,正好可以解決這類問題。
@Async是Spring的註解,將方法標註為「非同步」方法。當Spring Boot遇到此註解時,會獨立於線程執行此方法,避免在主線程使用,導致阻塞的可能。適用於額外處理且耗時的操作,像是調用外部API、DB操作、文件處理等等。
@SpringBootApplication
@EnableAsync
public class AsyncApplication {
public static void main(String[] args) {
SpringApplication.run(AsyncApplication.class, args);
}
}
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
@Async // 標為非同步,此方法被調用時,會由另個thread執行,不占用主thread。
public void task() {
// 印出此方法執行之thread名,確認與主thread不同
System.out.println("非同步任務:" + Thread.currentThread().getName());
try {
Thread.sleep(3000); // 模擬Thread暫停三秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成");
}
}
@RestController
public class AsyncController {
private final AsyncService asyncService;
public AsyncController(AsyncService asyncService) {
this.asyncService = asyncService;
}
@GetMapping("/startTask")
public String startAsyncTask() {
asyncService.task();
return "非同步任務已啟動";
}
}
代表當調用 /startTask 時,系統會立刻返回 '非同步任務已啟動' 的響應,而不必等到 task() 方法完全執行結束。
@Async是Spring Framework的一部分,雖非Spring Boot獨有,但使用Spring Boot同樣具有配置簡化的優勢,只要使用@EnableAsync就能快速啟動非同步機制,處理起來更方便也更快速。