spring boot 中的異步@Async

spring boot 開啟異步調用

1、啟動類上添加@EnableAsync注解,表示啟動異步

2、在具體實現異步的方法上添加@Async注解

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
package com.example.demo;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;/*** @Description: TODO* @author: sl* @date: 2024年05月30日 21:55*/
@Component
public class DemoController {/***  Async相當于是方法級別的線程,本身沒有自定義線程池更加靈活*  相當于是每進來一個請求就開啟一個線程,超過核心線程數小于最大線程數放入隊列,*  隊列滿了,繼續創建線程直至達到最大線程數* @throws InterruptedException*/@Asyncpublic void testSync() throws InterruptedException {Thread.sleep(2000);System.out.println("異步執行成功");}
}

測試執行?

package com.example.demo;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DemoApplicationTests {@Autowiredprivate DemoController demoController;@Testvoid contextLoads() throws InterruptedException {demoController.testSync();System.out.println("主線程執行");Thread.sleep(4000);}}

執行結果?

執行原理

SpringBoot會默創建了一個線程池,使用這里面的線程來執行異步調用,在項目中使用

手動創建線程池異步調用?

常用線程池創建以及弊端

Executors 是一個 Java 中的工具類。提供四種線程池創建方式,工廠方法來創建不同類型的線程池。Executors 的創建線程池的方法,創建出來的線程池都實現了ExecutorService 接口,

1.newFiexedThreadPool(int Threads):創建固定數目線程的線程池。
2.newCachedThreadPool():創建一個可緩存的線程池,調用 execute將重用以前構造的線程(如果線程可用)。如果沒有可用的線程,則創建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。
3.newSingleThreadExecutor() 創建一個單線程化的 Executor。
4.newScheduledThreadPool(int corePoolSize) 創建一個支持定時及周期性的任務執行的線程池,多數情況下可用來替代 Timer 類

不建議大家使用Executors這個類來創建線程池呢,阿里開發手冊這樣定義:
強制】線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方式

Executors 返回的線程池對象的弊端如下:

1) FixedThreadPool 和 SingleThreadPool:

允許的請求隊列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM

2) CachedThreadPool 和 ScheduledThreadPool:

允許的創建線程數量為 Integer.MAX_VALUE, 可能會創建大量的線程,從而導致 OOM

使用常見的三種線程池創建方式,單一、可變、定長都有一定問題,原因是 FixedThreadPool 和 SingleThreadExecutor 底層都是用LinkedBlockingQueue 實現的,這個隊列最大長度為 Integer.MAX_VALUE,容易導致 OOM
所以實際生產一般自己通過 ThreadPoolExecutor 的 7 個參數,自定義線程池

spring boot創建線程池?

springboot創建線程池,Spring提供的對ThreadPoolExecutor封裝的線程池ThreadPoolTaskExecutor,直接使用注解啟用。
Async相當于是方法級別的線程,本身沒有自定義線程池更加靈活

package com.example.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;/*** @Description: TODO* @author: sl* @date: 2024年05月30日 22:37*/
@Configuration
public class MyPoolConfig {@Beanpublic TaskExecutor taskExecutor(){ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//設置核心線程數executor.setCorePoolSize(10);//設置最大線程數executor.setMaxPoolSize(15);//設置隊列容量executor.setQueueCapacity(20);//設置線程活躍時間(秒)executor.setKeepAliveSeconds(60);//設置默認線程名稱executor.setThreadNamePrefix("1111-");//設置拒絕策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//等待所有任務結束后再關閉線程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}}

在Async中指定線程池

package com.example.demo;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;/*** @Description: TODO* @author: sl* @date: 2024年05月30日 21:55*/
@Component
public class DemoController {/***  Async相當于是方法級別的線程,本身沒有自定義線程池更加靈活*  相當于是每進來一個請求就開啟一個線程,超過核心線程數小于最大線程數放入隊列,*  隊列滿了,繼續創建線程直至達到最大線程數* @throws InterruptedException*/@Async("taskExecutor")public void testSync() throws InterruptedException {System.out.println(Thread.currentThread().getName());Thread.sleep(2000);System.out.println("異步執行成功");}
}

執行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21686.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv3+mAP實現金魚檢測

YOLOv3mAP實現金魚檢測 Git源碼地址:傳送門 準備數據集 按幀數讀取視頻保存圖片 video2frame.py使用labelimg標注工具對圖片進行標注統一圖片大小為 416x416,并把標簽等信息寫成.xml文件 conver_point.py讀取縮放后的標簽圖片,轉為左上角右下…

如何快速部署上線項目

CSDN 的小伙伴們,大家好呀,我是蒼何。 今天在群里面看到有小伙伴反饋說,面試的時候一被問到簡歷中的項目還沒上線,就不繼續問了,感覺挺奇葩的,要知道就校招來說,項目本身大部分都是練手的項目&…

Linux基礎1-基本指令3

上篇文章我們說到了文件,pwd,touch,mkdir等知識。 Linux基礎1-基本指令2(你真的了解文件嗎?)-CSDN博客 本文繼續梳理其他基礎命令 1.本章重點 1.刪除一個空目錄命令rmdir 2.刪除一個文件指令rm(重要!) 3.man命令&am…

Lf工作流自定義html節點

1.定義js文件CustomCircle.js import { HtmlNode, HtmlNodeModel } from "logicflow/core"; class UmlModel extends HtmlNodeModel {setAttributes() {this.text.editable false; // 禁止節點文本編輯// 設置節點寬高和錨點const width 120;const height 70;thi…

做視頻號小店保證金要交多少?保證金提現條件是什么?

大家好,我是噴火龍。 做視頻號小店也是需要繳納保證金的,保證金分為類目保證金和浮動保證金。 先來說說類目保證金,類目保證金由視頻號小店主體資質類型和經營商品類目決定。 類目保證金有以下三點需要注意: 1. 如果你要申請新…

CentOS 7~9 救援模式恢復root密碼實戰指南

在管理Linux服務器時,忘記root密碼是一件棘手的事情,但幸運的是,CentOS提供了救援模式來幫助我們重置root密碼。本文將詳細介紹如何通過GRUB引導菜單進入緊急模式(或稱為救援模式),進而恢復root用戶的密碼。…

Python量化交易學習——Part4:基于基本面的單因子選股策略

技術分析與基本面分析是股票價格分析最基礎也是最經典的兩個部分。技術分析是針對交易曲線及成交量等指標進行分析,基本面分析是基于公司的基本素質進行分析。 一般來說選股要先選行業,在選個股,之后根據技術分析選擇買賣節點,因此針對行業及個股的基本面分析是選股的基礎。…

【ARMv7-A】——WFE(wait for event)

文章目錄 WFE基本概念工作原理事件類型使用場景WFIWFEWFE 和 WFI 相同點WFE 和 WFI 不同點觸發條件事件標志影響多核系統中的應用使用場景:代碼實例linux 內核中的 WFI 指令WFE WFE 即 Wait for ev

# 全面解剖 消息中間件 RocketMQ-(4)

全面解剖 消息中間件 RocketMQ-(4) 一、RocketMQ 順序消息分析 1、消息有序:指的是可以按照消息的發送順序來消費(FIFO)。RocketMQ 可以嚴格的保證消息有序,可以分為分區有序或者全局有序。 2、順序消費的原理解析 在默認的情…

身份證真假查詢API、C#身份證識別、駕駛證識別接口

線上平臺想要在節省成本、節省時間的前提下實現身份證實名認證的功能,可以考慮云服務平臺,例如翔云API開放平臺,專注于數字化接口服務的提供。翔云身份證實名認證接口,搭配翔云身份證識別接口,實時聯網秒速核驗身份證信…

vfrom二開給左邊添加字段或者容器

例如,我在左側加入一個 我的公司 字段 修改三個文件,這是文件目錄 這個文件是當界面選擇 簡體中文 的時候,顯示的 字段組件 或者 容器組件的中文名 這個文件是當界面選擇 English 的時候,顯示的 字段組件 或者 容器組件的英文名 把…

Spring Boot 集成 zxing 生成條形碼與二維碼

前面我們知道了怎么通過 使用 zxing 生成二維碼以及條形碼, 由于我們現在都是 web 端的項目了,那么我們看下怎么使用 Spring Boot 集成然后返回給前端展示: 工程源碼 對應的工程源碼我放到了這里:github源碼路徑,點擊…

d2-crud-plus 使用小技巧(六)—— 表單下拉選擇 行樣式 溢出時顯示異常優化

問題 vue2 elementUI d2-crud-plus,數據類型為select時,行樣式顯示為tag樣式,但是如果選擇內容過長就會出現下面這種bug,顯然用戶體驗不夠友好。 期望 代碼 js export const crudOptions (vm) > {return {...columns:…

圖書管理系統(https://github.com/plusmultiply0/bookmanagesystem)

特意去github找了一個用flask框架的項目,一起來學習它吧 這個系統包括很多功能:用戶權限管理模塊(管理員和普通用戶),注冊登錄模塊(滑塊驗證碼功能),圖書有關信息模塊(借…

毫米級精度3D人臉掃描設備,助推打造元宇宙虛擬分身

在元宇宙中,虛擬分身對應的是一個三維模型,數字化的過程則是三維重建過程,通過3D人臉掃描可以通過多相機同步采集人臉部,可快速、準確地重建出真人地臉部模型及貼圖,通過3D人臉掃描設備可快速重建出高逼真的虛擬分身。…

Linux系統下+jmeter分布式壓測

一.配置jdk(Linux機都需配置同一個版本) 下載Linux系統的jdk,下載地址:https://repo.huaweicloud.com/java/jdk/ 下載后的jdk文件上傳到 /opt目錄下 進入opt目錄,查看jdk文件 cd /opt ll 1.解壓文件 tar xzvf jd…

真國色碼上贊,科技流量雙劍合璧,商家獲客新紀元開啟

在數字化浪潮洶涌的今天,真國色研發團隊依托紅玉房網絡科技公司的雄厚實力,憑借科技領先的核心競爭力,推出了創新性的商家曝光引流工具——碼上贊。這款工具借助微信支付與視頻號已有功能,為實體商家提供了一種全新的引流獲客方式,實現了科技與商業的完美融合。 科技領先,流量黑…

CSS 空間轉換 動畫

目錄 1. 空間轉換1.1 視距 - perspective1.2 空間轉換 - 旋轉1.3 立體呈現 - transform-style1.4 空間轉換 - 縮放 2. 動畫 - animation2.1 動畫的基本用法2.1 animation 復合屬性2.2 animation 拆分屬性2.3 多組動畫 正文開始 1. 空間轉換 空間:是從坐標軸角度定義…

Paddle實現單目標檢測

單目標檢測 單目標檢測(Single Object Detection)是人工智能領域中的一個重要研究方向,旨在通過計算機視覺技術,識別和定位圖像中的特定目標物體。單目標檢測可以應用于各種場景,如智能監控、自動駕駛、醫療影像分析等…

短視頻矩陣系統搭建開發,ai智能剪輯系統,矩陣發布,一鍵管理多個賬戶

前言: 企業短視頻矩陣是企業通過搭建多個短視頻平臺賬號,形成一個多元化的內容傳播網絡。它旨在通過多平臺內容的同步傳播,實現企業品牌價值的最大化。短視頻矩陣包括抖音、快手、視頻號、小紅書、百家號等熱門短視頻平臺,其核心…