成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解密SpringBoot線程池

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

哈嘍,大家好,我是了不起。

我們在日常開發(fā)中,經(jīng)常跟多線程打交道,Spring 為我們提供了一個線程池方便我們開發(fā),它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程池吧。

使用@Async聲明多線程

SpringBoot 提供了注解 @Async 來使用線程池, 具體使用方法如下:

  1. 在啟動類(配置類)添加@EnableAsync來開啟線程池
  2. 在需要開啟子線程的方法上添加注解 @Async

下面是一個簡單的例子:

@Component
@EnableAsync
@EnableScheduling
public class ScheduleTask {

    @Async
    @Scheduled(fixedRate = 2000)
    public void testAsync1() {
        try {
            Thread.sleep(6000);
            System.out.println(LocalDateTime.now() + "--線程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() + "--線程2:" + Thread.currentThread().getName());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

啟動項(xiàng)目,得到如下日志結(jié)果:

圖片圖片

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

原因是 SpringBoot2.1.0 版本后,新增了 TaskExecutionAutoConfiguration 配置類。其中聲明的默認(rèn)線程池就是 ThreadPoolTaskExecutor 。而 @Async 在選擇執(zhí)行器的時候會先去 IOC 容器中先找是否有 TaskExecutor 的 Bean對象,所以在當(dāng)前版本 SpringBoot 中,@Async 的默認(rèn) TaskExecutor 是 ThreadPoolTaskExecutor。

線程池配置

在 SpringBoot 項(xiàng)目中,我們可以在 yaml 或者 properties 配置文件中配置,或者使用 @Configuration 配置,下面演示配置方法。

  1. application.properties配置文件中配置
# 核心線程池數(shù)
spring.task.execution.pool.core-size=5
# 最大線程池數(shù)
spring.task.execution.pool.max-size=10
# 任務(wù)隊列的容量
spring.task.execution.pool.queue-capacity=5
# 非核心線程的存活時間
spring.task.execution.pool.keep-alive=60
# 線程池的前綴名稱
spring.task.execution.thread-name-prefix=test-task-
  1. 配置類中配置
@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ù)字段用于配置絕策略,常用拒絕策略如下

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

處理流程

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

使用注意

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

總結(jié)

上面簡單介紹了 Spring 自帶的線程池 ThreadPoolTaskExecutor 的配置和使用,并且講了線程池的參數(shù)和處理流程。當(dāng)然Spring提供了7個線程池的實(shí)現(xiàn),感興趣的可以自行了解~

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2021-06-17 06:57:10

SpringBoot線程池設(shè)置

2024-07-09 10:13:15

2024-02-28 09:54:07

線程池配置

2023-05-19 08:01:24

Key消費(fèi)場景

2025-04-10 08:05:00

Netty線程池代碼

2024-07-15 08:20:24

2023-03-06 08:49:02

加密和解密SpringBoot

2012-05-15 02:18:31

Java線程池

2020-12-10 08:24:40

線程池線程方法

2024-01-31 08:26:44

2023-06-07 13:49:00

多線程編程C#

2025-01-09 11:24:59

線程池美團(tuán)動態(tài)配置中心

2017-01-10 13:39:57

Python線程池進(jìn)程池

2019-12-27 09:09:42

Tomcat線程池JDK

2012-02-29 13:26:20

Java

2024-11-21 07:00:00

線程池Java開發(fā)

2024-12-13 08:21:04

2020-09-04 10:29:47

Java線程池并發(fā)

2013-05-28 13:57:12

MariaDB

2011-06-22 15:50:45

QT 線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 九九九视频在线观看 | 国内精品久久久久久久 | 日日干夜夜操 | 精品一区二区三区在线视频 | 久久亚洲国产精品 | 亚洲福利 | 性做久久久久久免费观看欧美 | 怡红院免费的全部视频 | 国产亚洲第一页 | 久久亚洲视频 | 九九亚洲 | 久久香蕉精品视频 | 乱码av午夜噜噜噜噜动漫 | 在线欧美| 91精品国模一区二区三区 | 亚洲国产成人久久久 | 亚洲欧美激情国产综合久久久 | 国产欧美一区二区三区在线看 | 成人免费小视频 | 亚洲精品一区二区三区蜜桃久 | 亚洲国产一区二区三区四区 | 日韩三级在线观看 | a国产一区二区免费入口 | 国产日韩久久 | 午夜资源| 国产精品美女久久久久久久久久久 | 特一级毛片 | 国产精品一区二区免费看 | 人人干人人舔 | 欧美a区| 久久婷婷av | 秋霞电影一区二区三区 | 免费色网址 | 国产精品久久久久久婷婷天堂 | 午夜丰满少妇一级毛片 | 久久91精品久久久久久9鸭 | 国产一区二区三区四区五区3d | 欧美久久久 | 日韩欧美精品一区 | 日韩欧美在线精品 | 欧美国产激情二区三区 |