這個註解看著async應該可以猜測用途,那就是非同步。
這個註解是用來將某個被標註的方法給弄成非同步的效果,達到new thread的作用,
博主也趕緊拿來了**測試。
非同步我最先是在js學習時,ajax提交那裡第一次接觸,有乙個async屬性,來設定這個ajax是非同步還是同步。
如下偽**所示:
$(function())
do something else;//2
});
js裡的非同步,就是這裡的不需要ajax的請求得到返回結果,就可以執行2
而如果是同步,則是這裡的async=false,必須ajax請求得到返回結果才能執行2
我就模擬這裡的ajax,認為@async也是這個含義(經過試驗,猜測正確)
public object testasync(string param)
public void async()
if(system.currenttimemillis()-5000>now)
}}
5秒內呼叫兩次介面:
結果說明什麼:(按時間順序)// @async
controller 開始:2018-12-10 09:35:12.472 1 thread:thread[http-nio-8011-exec-1,5,main]// 第一次呼叫
1544405712472 thread:thread[http-nio-8011-exec-1,5,main]// 第一次呼叫
controller 開始:2018-12-10 09:35:13.863 1 thread:thread[http-nio-8011-exec-2,5,main]//第二次呼叫
1544405713863 thread:thread[http-nio-8011-exec-2,5,main]//第二次呼叫
非同步方法:執行完成2018-12-10 09:35:17.473 thread:thread[http-nio-8011-exec-1,5,main]// 第一次呼叫
controller 返回 2018-12-10 09:35:17.473thread :thread[http-nio-8011-exec-1,5,main]// 第一次呼叫
非同步方法:執行完成2018-12-10 09:35:18.864 thread:thread[http-nio-8011-exec-2,5,main]//第二次呼叫
controller 返回 2018-12-10 09:35:18.864thread :thread[http-nio-8011-exec-2,5,main]//第二次呼叫
第一次進入controller
第一次進入sync方法
第二次進入controller
第二次進入async方法
第一次退出async方法
第一次退出controller
第二次退出async方法
第二次退出controller
上述結果說明service的async方法沒有被第乙個執行緒獨佔,即第一下執行緒還在async方法中時,第二個也能同時進入。
並且controller方法的返回是出現在對應次的async方法退出之後再退出controller
但是這裡的同步應該不是指async被執行緒獨佔,而是指 每次請求都是進入controller-》進入async方法-》退出async方法-》退出controller
需要注意的是:springboot需要在啟動類上標註@enableasync,不然是不生效的
service方法:
@async
public void async()
if(system.currenttimemillis()-5000>now)
}}
controller 開始:2018-12-10 15:25:42.739 1 thread:thread[http-nio-8011-exec-1,5,main]發現了,的確是先完成了controller方法,而async方法還在繼續,和js的ajax的異效果是一致的。controller 返回 2018-12-10 15:25:42.743thread :thread[http-nio-8011-exec-1,5,main]
1544426742747 thread:thread[task-1,5,main]
非同步方法:執行完成2018-12-10 15:25:47.748 thread:thread[task-1,5,main]
controller 開始:2018-12-10 15:25:48.602 1 thread:thread[http-nio-8011-exec-3,5,main]
controller 返回 2018-12-10 15:25:48.602thread :thread[http-nio-8011-exec-3,5,main]
1544426748603 thread:thread[task-2,5,main]
非同步方法:執行完成2018-12-10 15:25:53.604 thread:thread[task-2,5,main]
與不使用@asyn對比發現;
不使用@async:執行緒名字是: thread:thread[http-nio-8011-exec-1,5,main]是thread
使用@async:執行緒名字是:1544426742747 thread:thread[task-1,5,main]是 task(多核執行緒,檢視jdk原始碼定義,這個可以用來更新進度條的的作用,這裡就不糾結了,是執行緒)
上面兩種情況觀察發現:
1,@async達到的非同步效果是ajax的那樣
2,@async開啟了執行緒(task)
Spring非同步方法註解 Async
spring 配置檔案增加以下配置 注意點 在同乙個類中 乙個方法呼叫另外乙個有註解 比如 async,transational 的方法,註解是不會生效的。在呼叫 async方法的類後面新增註解 enableasync 在被呼叫的方法增加 async註解 呼叫和被呼叫,不能在乙個類裡面定義,要分開定...
Spring中 Async註解實現非同步
簡單介紹 spring為任務排程與非同步方法執行提供了註解支援。通過在方法上設定 async註解,可使得方法被非同步呼叫。也就是說呼叫者會在呼叫時立即返回,而被呼叫方法的實際執行是交給spring的taskexecutor來完成。async註解的開啟 如果是在springboot專案中使用的話,則更...
Spring 通過 Async註解實現多執行緒
一 新建配置類 configuration enableasync public class threadpooltaskconfig 二 建立方法類 service public class taskservice 三 啟動類新增註解 componentscan com.example enabl...