springboot 多线程实现

为什么用线程池

有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间比线程真正执行的时间还长。而且当线程数量太多时系统不一定能受得了

使用线程池主要为了解决一下几个问题:

降低资源消耗:通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销

提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行

提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一维护和管理,分配、调优和监控

线程池规则

线程池线程执行规则任务队列有很大的关系。

下面都假设任务队列没有大小限制:

如果线程数量 <= 核心线程数量,那么 直接启动一个核心线程 来执行任务,不会放入队列中。

如果线程数量 > 核心线程数,但 <= 最大线程数,并且任务队列是LinkedBlockingDeque的时候,超过核心线程数量的任务会放在任务队列中排队。
如果线程数量 > 核心线程数,但 <= 最大线程数,并且任务队列是SynchronousQueue的时候,线程池会创建新线程执行任务,这些任务也不会被放在任务队列中。这些线程属于非核心线程,在任务完成后,闲置时间达到了超时时间就会被清除。

如果线程数量 > 核心线程数,并且 > 最大线程数,当任务队列是LinkedBlockingDeque,会将超过核心线程的任务放在任务队列中排队。也就是当任务队列是LinkedBlockingDeque并且没有大小限制时,线程池的最大线程数设置是无效的,他的线程数最多不会超过核心线程数。
如果线程数量 > 核心线程数,并且 > 最大线程数,当任务队列是SynchronousQueue的时候,会因为线程池 拒绝添加 任务而抛出异常。 

任务队列大小有限时

当LinkedBlockingDeque塞满时,新增的任务会直接创建新线程来执行,当创建的线程数量超过最大线程数量时会抛异常。
SynchronousQueue没有数量限制。因为他根本不保持这些任务,而是直接交给线程池去执行。当任务数量超过最大线程数时会直接抛异常。

常用类

Executor

Executor是一个接口,跟线程池有关的基本都要跟他打交道。下面是常用的ThreadPoolExecutor的关系
在这里插入图片描述

在这里插入图片描述
Executor接口很简单,只有一个execute方法

ExecutorServiceExecutor的子接口,增加了一些常用的对线程的控制方法,之后使用线程池主要也是使用这些方法

AbstractExecutorService是一个抽象类ThreadPoolExecutor就是实现了这个类

ThreadPoolExecutor

ThreadPoolExecutor的使用

线程池的创建

构造方法
在这里插入图片描述
构造方法参数说明

  • corePoolSize
    核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true。

    提交一个任务到线程池时,线程池会创建一个线程来执行任务即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了prestartAllCoreThreads()方法,线程池会提前创建并启动所有基本线程

  • maximumPoolSize
    线程池所能容纳的最大线程数超过这个数的线程将被阻塞。当任务队列为没有设置大小的LinkedBlockingDeque时࿰

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以通过使用多线程来实现并发操作。在Spring Boot中,可以使用ThreadPoolTaskExecutor来创建线程池,实现线程的功能。通过在应用程序的主类上添加@EnableAsync注解,可以启用异步方法的支持。在需要使用多线程的方法上添加@Async注解,就可以将该方法变为异步方法,使其在独立的线程中执行。这样可以提高系统的并发性能,特别是在处理一些耗时的任务时,如批量插入大量数据到数据库中。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [springboot线实现](https://blog.csdn.net/m0_67402970/article/details/126063616)[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,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringBoot实现线程](https://blog.csdn.net/zbzcDZF/article/details/126359589)[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,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SpringBoot使用多线程](https://blog.csdn.net/csdn_life18/article/details/123082702)[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,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值