異步方法執行的線程池
默認情況下,Spring會查找一個關聯的線程池:要么是一個org.springframework.core.task.TaskExecutor類型的bean,要么是一個類型是 java.util.concurrent.Executor名字是taskExecutor的bean。如果這兩個都沒找到,Spring會使用org.springframework.core.task.SimpleAsyncTaskExecutor來執行異步方法,SimpleAsyncTaskExecutor實際上並不是線程池,它是為每一個新任務創建一個新的線程。
-
@EnableAsync
-
@Async:用來標記一個方法是異步執行的,表示調用該方法的線程與此方法異步執行,它可以加在方法上也可以加在類上,如果是加在類上,說明類里面所有的方法都是異步執行的。
目標方法可以有任意的參數,但是返回值只能要么是void(那么調用過程中的異常信息是無法返回給調用者的,默認只是記錄日志。),要么是Future,如果是Future,也可以返回它的子類ListenableFuture或者CompletableFuture,這樣就可以跟異步任務更好的進行交互,如果不是future是無法獲取返回值的。
如下方式會使@Async失效
-
異步方法使用static修飾
-
異步類沒有使用@Component注解(或其他注解)導致spring無法掃描到異步類
-
類中需要使用@Autowired或@Resource等注解自動注入,不能自己手動new對象
-
如果使用SpringBoot框架必須在啟動類中增加@EnableAsync注解
-
在Async 方法上標注@Transactional是沒用的。 在Async 方法調用的方法上標注@Transactional 有效。
-
調用被@Async標記的方法的調用者不能和被調用的方法在同一類中不然不會起作用