spring註解之 Async小測試

2021-09-02 22:41:18 字數 2949 閱讀 4178

這個註解看著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 返回 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]

發現了,的確是先完成了controller方法,而async方法還在繼續,和js的ajax的異效果是一致的。

與不使用@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...