线程池的基础使用和执行策略

本文详细介绍了线程池的概念,包括其工作原理、常用的Executor接口和类,以及Executors工具类提供的几种常见线程池创建方式。重点阐述了线程池的执行流程,包括任务提交、线程调度和拒绝策略的处理。
摘要由CSDN通过智能技术生成

什么是线程池

线程池,字面意思就是一个创建线程的池子,它的特点就是,在使用线程之前,就一次性把多个线程创建好,放到"池”当中。后面需要执行任务的时候,直接从"线程池"当中通过线程执行。当线程执行完毕之后,也不是直接销毁线程,而是把线程重新放回到"池子“当中,等需要再次执行任务的时候,就再次从池子当中获取线程,执行任务。

如图

线程池常用接口和类

Executor: 线程池顶级接口

ExecutorService:线程池接口,可通过submit(Runnable task)提交任务,用来定义线程池的实现规范的接口(同时继承于Executor接口)

 

Executors工具类:通过此类可以获得一个线程池,并且里面有配置好的线程池可供选择

通过工具类可以创建四种常用线程池

  ExecutorService executorService = Executors.newCachedThreadPool();
  ExecutorService executorService1 = Executors.newFixedThreadPool(10);
  ExecutorService executorService2 = Executors.newSingleThreadExecutor();
  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

newCachedThreadPool():没有核心线程数,创建一个动态的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

newFixedThreadPool(10):创建固定数目线程的线程池,参数即使核心线程池数也是最大线程池数量

newSingleThreadExecutor():创建一个单线程化的Executor,核心线程数与最大线程数都为1

Executors.newScheduledThreadPool():能够进行任务调度的线程池

线程池的执行流程

首先当线程池空闲时,会进行以下步骤进行操作

  1. 提交任务:当有人需要执行任务时,通过`execute()`或`submit()`方法提交任务到线程池,线程池会将任务放入任务队列中,等待线程来执行
  2. 然后选择线程执行任务:线程池会从任务队列中选择一个任务,然后从线程池中选择一个空闲的线程来执行任务。
  3. 再执行任务:选中线程开始执行任务。线程执行任务期间,会不断从任务队列中获取任务并执行,直到任务队列为空或线程池被关闭

 

当线程池中不存在空闲线程时

  1. 如果没有空闲线程,则去判断核心线程池是否已满,如果没有则创建核心线程执行任务
  2. 否则则去进入工作队列进行等待,如果有线程空闲则立刻分配
  3. 当工作队列也满时,会去线程池里创建普通线程去执行任务
  4. 当普通线程池也满时,证明当前线程池已经不能再进行任务的执行了
  5. 这个时候就会执行拒绝策略
  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot中使用线程池可以通过ThreadPoolTaskExecutor类来实现。这个类是在java中ThreadPoolExecutor的基础上进行封装的\[1\]。下面是一个使用ThreadPoolTaskExecutor的示例代码: 首先,在pom.xml文件中添加spring-boot-starter-web和spring-boot-starter-test依赖。 然后,在配置类中定义一个自定义的线程池@Bean,例如callbackThreadPool()方法\[2\]。在这个方法中,我们可以设置线程池的核心线程数、最大线程数、最大存活时间、工作队列大小等参数,并且可以自定义拒绝策略。 最后,通过调用callbackThreadPool()方法来获取线程池对象,可以在需要的地方使用这个线程池执行任务。 总结来说,Spring Boot中使用线程池可以通过ThreadPoolTaskExecutor类来创建和配置线程池,然后通过调用方法来获取线程池对象并使用它来执行任务\[3\]。 #### 引用[.reference_title] - *1* *3* [SpringBoot使用线程池](https://blog.csdn.net/qq_24983911/article/details/94722569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Springboot项目中如何使用线程池](https://blog.csdn.net/weixin_40516924/article/details/121098799)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值