springboot使用 async實現非同步執行緒池

2022-06-25 21:06:09 字數 2983 閱讀 2502

工作中經常涉及非同步任務,通常是使用多執行緒技術,比如執行緒池threadpoolexecutor,但使用executors容易產生oom,需要手動使用threadpoolexecutor建立執行緒池;在springboot使用 @async 可以實現非同步呼叫,配置執行緒池引數,可以簡單的實現多執行緒的執行緒池效果,從而簡化開發,避免oom;

我們知道同步執行就是按照**的順序執行,而非同步執行則是無序,在springboot中使用實現非同步呼叫函式非常簡單,首先在啟動類上加上@enableasync註解;

/**

* @author lsc

* */

@enableasync

public static void main(string args)

}

其次,在函式上標上@sync註解,表示非同步呼叫

@async

public void taskone() throws exception

@async

public void tasktwo() throws exception

測試**

@autowired

task task;

@test

public void test() throws exception

如果按照同步執行邏輯會先執行任務一,然後再執行任務二,如果是非同步執行,則無序,可能任務一先執行,也可能任務二先執行;

有時候要知道任務是否執行完成,再繼續做其它的業務邏輯,就需要使用到future介面,其含義是在執行非同步任務後會給乙個**函式,我們只要設定**資訊,就可以知道任務是否正確執行完成;我們對非同步函式,新增future返回值型別,使用new asyncresult<>()設定**資訊;

@component

public class task

@async

public futuretasktwo() throws exception

}

測試**如下, 等待2個任務全部完成後就列印出返回值資訊

@autowired

task task;

@test

public void test() throws exception }}

執行輸出

任務二

任務一任務一執行完成:任務二執行完成

在非同步掉用中使用的@async註解,預設的執行緒池大小如下;

# 核心執行緒數

spring.task.execution.pool.core-size=8

# 最大執行緒數

spring.task.execution.pool.max-size=16

# 空閒執行緒存活時間

spring.task.execution.pool.keep-alive=60s

# 是否允許核心執行緒超時

spring.task.execution.pool.allow-core-thread-timeout=true

# 執行緒佇列數量

spring.task.execution.pool.queue-capacity=100

# 執行緒關閉等待

spring.task.execution.shutdown.await-termination=false

spring.task.execution.shutdown.await-termination-period=

# 執行緒名稱字首

spring.task.execution.thread-name-prefix=task-

一般情況下,我們都需要手動建立執行緒池,使用 threadpooltaskexecutor 類進行配置;這邊設定了執行緒字首名稱,等下測試時就可以判定是否執行緒池配置成功;

@configuration

public class poolconfig

}

在task類中加上 新的乙個方法如下

@async

public void sayhello(string name)

使用測試類進行測試

@test

public void testpool() throws exception

執行結果如下,日誌列印出線程名稱為zszxz-1;

有時候,乙個專案中如果配置了多個執行緒池,如下格式

@bean("pool1")

public taskexecutor taskexecutor1()

@bean("pool2")

public taskexecutor taskexecutor2()

@bean("pool3")

public taskexecutor taskexecutor3()

在使用 @async註解時就需要指明具體使用的執行緒池,如下格式

@async("pool1")

public void sayhello1(string name)

@async("pool2")

public void sayhello1(string name)

SpringBoot使用thymeleaf模板

springboot開發的web專案contrller如何跳轉到前端頁面 據說,最流行的還是freemarker和velocity這兩種模板,我們這裡用spring官方推薦的thymeleaf模板 在建立好springboot專案的基礎上,進行如下配置 在pom中到thymeleaf的依賴 org....

Spring Boot使用Undertow做伺服器

1 建立spring boot專案,修改其pom.xml檔案 org.springframework.boot spring boot starter test org.springframework.boot spring boot starter web org.springframework....

SpringBoot快取使用

org.springframework.boot spring boot starter cache 專案使用springboot自帶的快取機制實現快取 redis快取 redis是一款記憶體快取記憶體資料庫 membase快取 memcache是乙個自由和開放源 高效能 分配的記憶體物件快取系統。...