日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

解密SpringBoot線(xiàn)程池

來(lái)源: 責(zé)編: 時(shí)間:2023-10-13 14:34:26 260觀看
導(dǎo)讀哈嘍,大家好,我是了不起。我們?cè)谌粘i_(kāi)發(fā)中,經(jīng)常跟多線(xiàn)程打交道,Spring 為我們提供了一個(gè)線(xiàn)程池方便我們開(kāi)發(fā),它就是 ThreadPoolTaskExecutor ,接下來(lái)我們就來(lái)聊聊 Spring 的線(xiàn)程池吧。使用@Async聲明多線(xiàn)程SpringBoot 提供

哈嘍,大家好,我是了不起。ViQ28資訊網(wǎng)——每日最新資訊28at.com

我們?cè)谌粘i_(kāi)發(fā)中,經(jīng)常跟多線(xiàn)程打交道,Spring 為我們提供了一個(gè)線(xiàn)程池方便我們開(kāi)發(fā),它就是 ThreadPoolTaskExecutor ,接下來(lái)我們就來(lái)聊聊 Spring 的線(xiàn)程池吧。ViQ28資訊網(wǎng)——每日最新資訊28at.com

使用@Async聲明多線(xiàn)程

SpringBoot 提供了注解 @Async 來(lái)使用線(xiàn)程池, 具體使用方法如下:ViQ28資訊網(wǎng)——每日最新資訊28at.com

  1. 在啟動(dòng)類(lèi)(配置類(lèi))添加@EnableAsync來(lái)開(kāi)啟線(xiàn)程池
  2. 在需要開(kāi)啟子線(xiàn)程的方法上添加注解 @Async

下面是一個(gè)簡(jiǎn)單的例子:ViQ28資訊網(wǎng)——每日最新資訊28at.com

@Component@EnableAsync@EnableSchedulingpublic class ScheduleTask {    @Async    @Scheduled(fixedRate = 2000)    public void testAsync1() {        try {            Thread.sleep(6000);            System.out.println(LocalDateTime.now() + "--線(xiàn)程1:" + Thread.currentThread().getName());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    @Async    @Scheduled(cron = "*/2 * * * * ?")    public void testAsync2() {        try {            Thread.sleep(1000);            System.out.println(LocalDateTime.now() + "--線(xiàn)程2:" + Thread.currentThread().getName());        } catch (Exception ex) {            ex.printStackTrace();        }    }}

啟動(dòng)項(xiàng)目,得到如下日志結(jié)果:ViQ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ViQ28資訊網(wǎng)——每日最新資訊28at.com

可以發(fā)現(xiàn)在當(dāng)前環(huán)境下 task-${id} 這個(gè) id 并不是一直增長(zhǎng)的,而是一直在復(fù)用 1-8。這個(gè)時(shí)候可能就會(huì)有的小伙伴們會(huì)比較好奇,默認(rèn)的不是 SimpleAsyncTaskExecutor 嗎?為什么從日志打印的效果上看像是一直在復(fù)用 8 個(gè)線(xiàn)程,難道用的是 ThreadPoolTaskExecutor?ViQ28資訊網(wǎng)——每日最新資訊28at.com

原因是 SpringBoot2.1.0 版本后,新增了 TaskExecutionAutoConfiguration 配置類(lèi)。其中聲明的默認(rèn)線(xiàn)程池就是 ThreadPoolTaskExecutor 。而 @Async 在選擇執(zhí)行器的時(shí)候會(huì)先去 IOC 容器中先找是否有 TaskExecutor 的 Bean對(duì)象,所以在當(dāng)前版本 SpringBoot 中,@Async 的默認(rèn) TaskExecutor 是 ThreadPoolTaskExecutor。ViQ28資訊網(wǎng)——每日最新資訊28at.com

線(xiàn)程池配置

在 SpringBoot 項(xiàng)目中,我們可以在 yaml 或者 properties 配置文件中配置,或者使用 @Configuration 配置,下面演示配置方法。ViQ28資訊網(wǎng)——每日最新資訊28at.com

  1. application.properties配置文件中配置
# 核心線(xiàn)程池?cái)?shù)spring.task.execution.pool.core-size=5# 最大線(xiàn)程池?cái)?shù)spring.task.execution.pool.max-size=10# 任務(wù)隊(duì)列的容量spring.task.execution.pool.queue-capacity=5# 非核心線(xiàn)程的存活時(shí)間spring.task.execution.pool.keep-alive=60# 線(xiàn)程池的前綴名稱(chēng)spring.task.execution.thread-name-prefix=test-task-
  1. 配置類(lèi)中配置
@Bean(name = "myThreadPoolTaskExecutor")public ThreadPoolTaskExecutor getMyThreadPoolTaskExecutor() {    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();    int i = Runtime.getRuntime().availableProcessors();    taskExecutor.setCorePoolSize(i * 2);    taskExecutor.setMaxPoolSize(i * 2);    taskExecutor.setQueueCapacity(i * 2 * 100);    taskExecutor.setKeepAliveSeconds(60);    taskExecutor.setThreadNamePrefix("my-task-");    taskExecutor.initialize();    return taskExecutor;}

拒絕策略

RejectedExectutionHandler 參數(shù)字段用于配置絕策略,常用拒絕策略如下ViQ28資訊網(wǎng)——每日最新資訊28at.com

  • AbortPolicy:用于被拒絕任務(wù)的處理程序,它將拋出RejectedExecutionException
  • CallerRunsPolicy:用于被拒絕任務(wù)的處理程序,它直接在execute方法的調(diào)用線(xiàn)程中運(yùn)行被拒絕的任務(wù)。
  • DiscardOldestPolicy:用于被拒絕任務(wù)的處理程序,它放棄最舊的未處理請(qǐng)求,然后重試execute。
  • DiscardPolicy:用于被拒絕任務(wù)的處理程序,默認(rèn)情況下它將丟棄被拒絕的任務(wù)。

處理流程

  1. 查看核心線(xiàn)程池是否已滿(mǎn),不滿(mǎn)就創(chuàng)建一條線(xiàn)程執(zhí)行任務(wù),否則執(zhí)行第2步。
  2. 查看任務(wù)隊(duì)列是否已滿(mǎn),不滿(mǎn)就將任務(wù)存儲(chǔ)在任務(wù)隊(duì)列中,否則執(zhí)行第3步。
  3. 查看線(xiàn)程池是否已滿(mǎn),即就是是否達(dá)到最大線(xiàn)程池?cái)?shù),不滿(mǎn)就創(chuàng)建一條線(xiàn)程執(zhí)行任務(wù),否則就按照策略處理無(wú)法執(zhí)行的任務(wù)。

使用注意

  1. 注解的方法必須是 public 方法。
  2. 方法一定要從另一個(gè)類(lèi)中調(diào)用,也就是從類(lèi)的外部調(diào)用,類(lèi)的內(nèi)部調(diào)用是無(wú)效的,因?yàn)?@Transactional 和 @Async 注解的實(shí)現(xiàn)都是基于 Spring 的 AOP ,而 AOP 的實(shí)現(xiàn)是基于動(dòng)態(tài)代理模式實(shí)現(xiàn)的。那么注解失效的原因就很明顯了,有可能因?yàn)檎{(diào)用方法的是對(duì)象本身而不是代理對(duì)象,因?yàn)闆](méi)有經(jīng)過(guò) Spring 容器。
  3. 異步方法使用注解 @Async 的返回值只能為 void 或者 Future。

總結(jié)

上面簡(jiǎn)單介紹了 Spring 自帶的線(xiàn)程池 ThreadPoolTaskExecutor 的配置和使用,并且講了線(xiàn)程池的參數(shù)和處理流程。當(dāng)然Spring提供了7個(gè)線(xiàn)程池的實(shí)現(xiàn),感興趣的可以自行了解~ViQ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-13491-0.html解密SpringBoot線(xiàn)程池

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: NET序列化工具:SharpSerializer庫(kù)快速上手并輕松完成序列化操作

下一篇: Tailwind CSS 真有那么好嗎?討厭它的前六大原因

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 临朐县| 夏津县| 波密县| 土默特右旗| 融水| 松溪县| 韶关市| 辉县市| 永顺县| 于都县| 盖州市| 高雄市| 莱西市| 陆丰市| 宣化县| 栖霞市| 安龙县| 云梦县| 察哈| 康平县| 徐闻县| 兰坪| 鸡西市| 开江县| 共和县| 屏东县| 正镶白旗| 濉溪县| 高唐县| 呼和浩特市| 景德镇市| 上高县| 闽清县| 兴化市| 阳泉市| 兴海县| 玉环县| 青州市| 巩留县| 枝江市| 阿巴嘎旗|