1:定義執行緒池
@enableasync
@configuration
class
taskpoolconfig
}
上面我們通過使用threadpooltaskexecutor
建立了乙個執行緒池,同時設定了以下這些引數:
說明:setwaitfortaskstocompleteonshutdown(true)
該方法就是這裡的關鍵,用來設定執行緒池關閉的時候等待所有任務都完成再繼續銷毀其他的bean,這樣這些非同步任務的銷毀就會先於redis執行緒池的銷毀。同時,這裡還設定了setawaitterminationseconds(60),該方法用來設定執行緒池中任務的等待時間,如果超過這個時候還沒有銷毀就強制銷毀,以確保應用最後能夠被關閉,而不是阻塞住。
2:如何使用該執行緒池呢?
@slf4j
@component
public
class
task
@async
(
"taskexecutor"
)
public
void
dotasktwo()
throws
exception
@async
(
"taskexecutor"
)
public
void
dotaskthree()
throws
exception
}
3 執行非同步任務
@runwith
(springjunit4classrunner.
class
)
@springboottest
public
class
@autowired
private
task task;
@test
public
void
test()
throws
exception
}
2018
-
03
-
27
22
:
01
:
15.620
info
73703
--- [ taskexecutor-
1
] com.didispace.async.task : 開始做任務一
2018
-
03
-
27
22
:
01
:
15.620
info
73703
--- [ taskexecutor-
2
] com.didispace.async.task : 開始做任務二
2018
-
03
-
27
22
:
01
:
15.620
info
73703
--- [ taskexecutor-
3
] com.didispace.async.task : 開始做任務三
2018
-
03
-
27
22
:
01
:
18.165
info
73703
--- [ taskexecutor-
2
] com.didispace.async.task : 完成任務二,耗時:
2545
毫秒
2018
-
03
-
27
22
:
01
:
22.149
info
73703
--- [ taskexecutor-
3
] com.didispace.async.task : 完成任務三,耗時:
6529
毫秒
2018
-
03
-
27
22
:
01
:
23.912
info
73703
--- [ taskexecutor-
1
] com.didispace.async.task : 完成任務一,耗時:
8292
毫秒
4 注意事項
注: @async所修飾的函式不要定義為static型別,這樣非同步呼叫不會生效
從異常信息jedisconnectionexception: could not get a resource from the pool
來看,我們很容易的可以想到,在應用關閉的時候非同步任務還在執行,由於redis連線池先銷毀了,導致非同步任務中要訪問redis的操作就報了上面的錯。所以,我們得出結論,上面的實現方式在應用關閉的時候是不優雅的,那麼我們要怎麼做呢?如下設定:
executor.setwaitfortaskstocompleteonshutdown(
true
);
executor.setawaitterminationseconds(
60
);
Springboot 執行緒池
配置類 configuration enableasync public class taskpoolconfig 執行執行緒中,如果有區域性變數要使用 或者有外部值傳入 新建thead 實現callable介面 可以直接使用函式中的值的話使用lambda表示式,使用completionservic...
springboot 執行緒池
1 在啟動類上加標記 enableasync slf4j exclude enableasync public class extends springbootservletinitializer 3 使用,方法名上加 async asyncserviceexecutor 這個方法只在外部呼叫才會開...
spring boot 非同步執行緒池
在專案中,有乙個非同步方法 async註解。當多使用者呼叫該非同步方法時,通過日誌跟蹤 發現最多只有兩個執行緒在非同步執行,其它的任務都在等待狀態。非同步配置檔案如下所示,懷疑是corepoolsize影響,故將其修改為5.後來網上發現如下解釋 重點講解 其中比較容易讓人誤解的是 corepools...