SpringBoot執行有返回值的非同步任務

2021-09-24 12:34:54 字數 2123 閱讀 7306

springboot如何使用多執行緒處理非同步任務,並且是代返回值的。比如,我乙個controller層的介面,呼叫到service層,在對應的service方法中有三個方法,這三個方法都是去調dao層查詢資料庫資料,每個查詢平均耗時5s,最後將這三個查詢的結果進行合併計算。如果不採用非同步查詢的至少需要15s的時間來處理這個請求。此時我們可以使用非同步任務方式來操作,可以減少10s左右的時間。

在springboot中使用非同步需要開啟非同步支援(@enableasync),**如下

@enableasync

public

class

}然後增加乙個配置類,不過這個springboot也會預設配置,一般我們使用執行緒池是都不使用預設的,而是使用自定義的:

/**

* @author mr. zhang

* @description 非同步執行緒池

* @date 2019-04-19 14:21

* @website

*/@configuration

public

class

asyncconfig

}

此配置為io密集型伺服器引數,即最大執行緒數為cpu核數*2(threads為cpu核數),其他拒絕策略預設即可。

在之後的非同步任務中使用此齣定義的執行緒池taskexecutor。

然後就是非同步任務,在對應的任務方法上標註@async(「taskexecutor」)即可,表示使用taskexecutor執行緒池中線程執行非同步任務。**參考:

@service

public

class

taskserver

catch

(interruptedexception e)

finally

return

newasyncresult

<

>(10

);}@async

("taskexecutor"

)public future

asynctask2

(countdownlatch latch)

catch

(interruptedexception e)

finally

return

newasyncresult

<

>(20

);}@async

("taskexecutor"

)public future

asynctask3

(countdownlatch latch)

catch

(interruptedexception e)

finally

return

newasyncresult

<

>(30

);}}

注意的是,需要在類上標註為元件註解,此處為@service。

在這三個方法中執行sleep,使執行緒都是sleep 3秒的時間。然後引數為countdownlatch,在每次執行完就countdown(),然後返回值為future,如果執行的非同步方法沒有返回值可以不需要countdownlatch和返回值就行。

在對應的測試類中執行

@runwith

(springrunner.

class

)@springboottest

public

class

catch

(interruptedexception e)

catch

(executionexception e)

}}

注意countdownlatch latch = new countdownlatch(3);有三個非同步方法傳入的值為3,在呼叫的非同步方法後面需要latch.await();

一定不要在latch.await();前去get()結果值,這樣會導致非同步方法強制執行。

另外,有的人也使用while迴圈,在所有結果出來前一致在迴圈等待,類似自旋鎖的原理,對資源消耗較高,還有,如果乙個任務出現錯誤,就可能會造成乙隻迴圈。而countdownlatch可在await()方法中傳入等待時間,如果超過這個時間就會結束等待,直接完成下面的操作。

多執行緒執行有返回值有引數的方法

1 建立乙個多執行緒執行方法有相同型別返回值和相同型別引數的委託 建立在類外 public delegate string functiondelegate string str 多執行緒執行的方法如下 public string getname string name 函式 2 將方法賦給委託 f...

springboot返回json輸出

我們在進行開發的過程的難免會進行物件的返回,比如乙個使用者物件user,以及乙個集合list,map等等。在這篇部落格中我們就是需要學習一下怎麼對乙個物件中某些屬性的處理。需要補充的一點就是springboot採用的是jackson進行的序列化以及反序列化,不用我們自己去進行實現,它是自動實現。我們...

Springboot返回json格式

該技術是解決springboot如何返回json格式的問題。學習該技術的起因是我們組的專案需要介面返回json格式,有時還需要多重巢狀返回要求的格式。技術難點 主要在返回巢狀json格式,如何正確的裝配並返回也是乙個難點。核心是使用restcontroller關鍵字 restcontroller p...