多线程--线程池

SpringBoot 多线程池实现方案 文章目录一、需求场景二、需要的核心注解三、自定义线程池配置3.1 所需依赖3.2 定义基类 AsyncConstants3.3 定义各线程池配置类PrimaryAsyncConstantsSecondaryAsyncConstants3.4 定义配置文件四、多线程池实现4.1 生成 Executor 对象4.2 声明异步方法4.3 调用示例 一、需求场景 通常情况,在小项目中,业务单一,单个线程池... 阅读详情

一.线程池的概念:

线程池是一种多线程处理形式,它预先创建并管理一组线程,用于执行提交的任务。线程池的核心思想是复用线程,避免频繁创建和销毁线程带来的性能开销。线程池通常由任务队列和线程集合组成,任务被提交到队列中,由空闲线程从队列中取出并执行。

 二.线程池创建时机:

 线程池里的核心线程并不是在初始化线程池的时候创建的而是采用懒汉模式的策略,在以下的情况会创建:

  • 当提交第一个任务时:即使核心线程数为N,线程池通常只创建处理第一个任务所需的1个线程

  • 当新任务到来且当前活跃线程数小于核心线程数时:线程池会创建新线程来处理任务,直到达到核心线程数

  • 通过prestartCoreThread()或prestartAllCoreThreads()方法:可以显式地提前启动核心线程

 三.为何从线程池中拿线程比创建线程的开销小呢?

这就要从操作系统看起,操作系统是分为用户态和内核态的,内核包括操作系统的各种核心功能,比如管理硬件设备和给软件提供稳定的运行环境,一个操作系统的内核就一份内核,一份内核要给所有的应用程序提供服务支持,而从线程池中取线程纯用户态的应用程序代码就能完成(可控),然而从操作系统中创建线程,就需要操作系统的内核来配合完成(不可控),所以使用线程池就可以省下程序切换到内核中这样的开销

四.java中提供的直接使用线程池

ThreadPoolExecutor类(线程池)

核心submit(Runnable) 通过一个Runnable描述一段要执行的任务(可以单独创建一个类或者匿名内部类或者lambda表达式) 通过submit提交到线程池的任务队列中,线程池中的线程就会从任务队列中读取任务来执行

重要的是其构造方法

一共四种构造方法,最主要的还是第四个构造方法参数最全的,接下来讨论第四种构造方法的各个参数的含义

第一个参数通过名字也能看出是核心线程数,创建时机可以看上述(二), 核心线程创建之后,直至线程池销毁这些线程才会销毁

第二个参数是线程池中最大线程的数量,线程池中的线程数量包括核心线程数和非核心线程数(自适应) 非核心线程在任务繁忙的时候就创建,不繁忙的时候就销毁,线程并不是越多越好,线程过多有些线程根本没机会拿到任务,操作系统还会因线程的调度,性能下降

第三个参数是非核心线程允许存在的时间,这个就是非核心线程创建后过了这个参数的时间之后就会自动销毁,以免任务不繁忙的时候非核心线程占用cup,内存等资源

第四个参数是时间的枚举类也就是第三个参数非核心线程存在时间的时间单位,一般都是秒SECONDS或者分钟MINUTES

第五个参数是线程池中的任务队列, 需要自己传入,可以使用数组/链表,指定capacity,指定优先级,是否带有阻塞功能等等..

线程池本身也是生产者消费者模型 调用submit方法就是生产任务, 线程池里的线程就是在消费任务, 需要一个任务队列

第六个参数是线程的工厂类(工厂模式可以参照前面文章), 给线程类提供的工厂类,尤其统一构造并线程且初始化线程的属性

第七个参数是线程池的拒绝策略,任务队列是阻塞队列,等任务队列满的时候再添加任务就会产生阻塞,当然我们不希望阻塞太多或阻塞太长时间,在业务逻辑中线程调用submit就阻塞无法响应用户的请求,用户等很久都拿不到响应,就是直观上的卡了,与其是卡了不如直接告诉请求失败

所以在线程池中发现队列满了,任务入队列的时候,不会真正的入队列,也不会真阻塞而是执行拒绝策略的代码

上述的线程池的创建太过于麻烦,java中封装好了更简单的接口ExcutorService和实现其方法的类Excutors(包含各种实现方法)↓

 

        ExecutorService threadPool = Executors.newCachedThreadPool();//最大线程是一个很大的数字(可以无限增加)

 newCachedThreadPool创建出来的线程池参数可以指定核心线程数这里的核心线程数和非核心线程数一样如果不指定就是一个很大的数, 其他的参数默认情况如下

  1. 核心线程数 (corePoolSize):

    • 默认值为 0。这意味着如果没有任务需要执行,线程池中不会保留任何线程。
  2. 最大线程数 (maximumPoolSize):

    • 默认值为 Integer.MAX_VALUE。这意味着线程池可以创建的最大线程数是 Java 虚拟机允许的最大值,这个数字非常大,通常可以认为是无限增加的。
  3. 线程空闲时间 (keepAliveTime):

    • 默认值为 60 秒。这意味着当线程空闲超过 60 秒时,线程会被终止并从线程池中移除。
  4. 任务队列 (workQueue):

    • 默认使用 SynchronousQueue。这是一个无界阻塞队列,它不存储元素,而是直接将任务提交给线程执行。如果当前没有空闲线程可用,新的任务会导致创建新的线程。
  5. 拒绝策略 (RejectedExecutionHandler):

    • 默认使用 AbortPolicy。这意味着当线程池无法接受新任务时(例如,所有线程都在忙且队列已满),会抛出 RejectedExecutionException 异常。

下面是自己实现一个固定线程个数的线程池的简单代码 

//实现一个固定线程个数的线程池
class MyThreadPool {

    private BlockingQueue<Runnable> queue = null;
    Thread[] Threads = null;


    public MyThreadPool(int n) {
        //这里使用ArrayBlockingQueue(阻塞队列)作为线程池的队列,容量为1000
        queue = new ArrayBlockingQueue<Runnable>(1000);

        Threads = new Thread[n];

        //初始化线程池,创建n个线程
        for (int i = 0; i < n; i++) {
            Threads[i] = new Thread(() -> {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            });
            Threads[i].start();
        }

    }

    //提交任务
    public void submit(Runnable task) throws InterruptedException {
        //将任务放入队列中
        queue.put(task);
    }

    //关闭线程池
    public void shutdown() {
        while (!queue.isEmpty()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        for (Thread thread : Threads) {
            thread.interrupt();
        }

    }
}

 

Python中多线程和线程池的使用方法 Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多线程和线程池是其强大的功能之一,可以让我们更加高效地利用CPU资源,提高程序的运行速度。本篇博客将介绍Python中多线程和线程池的使用方法,并提供一些实用的案例供读者参考。一、多线程多线程是指在同一进程中,有多个线程同时执行不同的任务。Python中的多线程是通过threading模块来实现的。上述代码中,我们定义了一个task函数,它接受一个参数num,用于标识任务。 阅读详情

相关推荐

ZEMAX知识点:坐标间断面(coordinate break)

zemax知识点:坐标间断面

weixin_47638568的博客 1万+

Java线程池初步解读

好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 几个月前,写了一篇《Java并发学习(一):进程和线程》,其中埋了一个坑,说我不会用线程池,毕竟像咱们这种小学生,在学校做的小破项目也用不到线程池这种高大上的东西,所以一直也没学。但是最近不是准备出去打工了嘛,所以线程池还是要学一下的,不然到时候面试官一问,啥也不会大眼瞪小眼,不是很尴尬吗~~~。这不,这两天看了下线程池,搞篇文章总结一下线程池的基本知识????

Robod的博客 2904

vue3+SuperMap iClient3D for Cesium实现可视域分析功能

基于Vue3框架及SuperMap iClient3D for Cesium提供的ViewShed3D类实现场景动态可视域分析

qq_43334519的博客 2247

02. 线程基础知识

一 创建线程的四种方式 几种方式的对比 继承Thread: 优势:编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程 劣势:线程类已经继承了Thread类,所以不能再继承其他父类 实现Runnable接口或者Callable接口 优势:还可以继续继承别的父类;多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想;其

m0_46836425的博客 951

YOLOv8实战火焰和烟雾检测 (视频教程)

本课程将手把手地教大家使用YOLOv8结合可变形卷积(deformable convolution)训练火焰和烟雾数据集,完成一个多目标检测实战项目,可实时检测图像、视频、摄像头和流媒体(http/rtsp)中火焰和烟雾,并提供可视化演示界面 。

bai666ai的博客 1914

Django 前后端分离实战:网络设备运维系统 - 从登录认证到业务模块

这篇文章分享了Django+Vue前后端分离开发网络设备运维系统的实战经验,重点介绍了登录认证、全局布局和设备管理三大模块的实现。文章包含以下核心内容: 登录模块实现:包括表单验证、Token认证、记住密码功能,以及美观的UI设计(渐变背景、毛玻璃效果) 全局布局架构:采用侧边栏+顶部导航的响应式设计,支持菜单权限控制和多设备适配 业务功能开发:详细展示了设备分类和部门管理的CRUD功能实现,包括列表展示、搜索过滤、分页等功能 常见问题解决:提供了5个开发中常见问题的解决方案,如Vue Router警告、C

qq_16766705的博客 525

线程池核心线程、等待队列、非核心线程的创建时机

线程池核心线程、等待队列、非核心线程的创建时机 创建入下线程池,核心线程数为2,最大活动线程数为10,缓存队列长度为2。 private static ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 1000L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), new ThreadFactory() { @Override

weixin_42934146的博客 3871

Kaamel白皮书:Agent-to-Agent(A2A)隐私安全最佳实践

随着AI智能体架构从单体模型演化为多Agent协同系统,A2A协议为智能生态提供了强大的互操作能力。然而,能力越大,责任亦重。若无完备的隐私保护和安全防护体系,A2A将沦为数据泄露、滥权执行的温床。Kaamel作为专注于泛安全方向的Agent基础设施构建者,呼吁业界将“隐私工程”与“安全编排”作为A2A系统设计的核心前提,共建可信Agent生态,守护智能协同时代的数据主权与系统安全。未来,Kaamel计划发布一套“可信Agent协同蓝图”,涵盖:A2A协议适配Agent SDK工具集;

kaamelai的博客 1598

多线程相关问题

核心线程池中的线程默认情况下是当有任务提交的时候才开始创建,而且就算空闲的线程足以处理新任务,它仍然会创建新的线程去处理,直到核心线程数达到最大值,如果调用了prestartAllCoreThreads()方法则会事先创建所有核心线程。正常情况下,核心线程池中的线程一但创建了就不会自动被销毁,除非设置了allowCoreThreadTimeOut=true,或者是线程在执行任务的时候报了异常。

“种一棵树最好的时间是十年前,其次就是现在。” 737

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

【雕爷学编程】Arduino FOC 之 AS5600 磁编码器的模拟电压与IIC通信

在Arduino平台上实现FOC可以提供平滑的运行和高度的扭矩、速度和位置控制,它通过精确控制电机的电流和电压来实现高效率、高精度和低噪声的操作。案例三在使用I2C通信读取角度值的基础上,添加了设置角度范围的功能。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。1、高性能电机控制:FOC是一种高级的电机控制算法,可以精准控制PMSM(永磁同步电机)和BLDC(无刷直流)电机,实现平滑的转速和扭矩输出。

雕爷学编程 1498

java线程池生成线程的时机

java线程池生成线程的时机 直接上结论: 1.当前线程数<核心线程数时,进来1个任务即生成一个核心线程。 2.线程数达到核心线程数,但阻塞队列没有满,线程数不变。 3.阻塞队列满了,每进来1个任务便生成1个线程,但不会超过最大线程。 4.当前线程数=最大线程数,阻塞队列也满了,那么新来的任务将进入抛弃策略。 验证环节 示例代码块 public class MyThreadPoolExecu...

Alex_Ku的博客 1795

华为OD机试真题 新系统 2026-09-06 Python&JS【仓储货物有序出库】

某仓储中心有一个货物堆放区,货物编号按乱序堆叠存放,只能从顶部取货,管理员需要将货物按编号从小到大取出。

MISAYAONE的博客 114

Python 多线程与线程池

Python多线程与线程池是处理I/O密集型任务的高效工具。本文从基础到进阶,详解了多线程的使用方法。首先介绍了线程概念和Python的threading模块,包括线程创建、同步机制(如Lock)等。随后讲解了线程池的优势及ThreadPoolExecutor的使用方法,对比了两种方式的性能和适用场景。文章还分析了GIL对多线程的影响,并提供了规避策略。最后通过网页爬取案例,展示了多线程和线程池的实际应用。对于I/O密集型任务,线程池因其简洁高效更推荐使用;而CPU密集型任务则建议改用多进程处理。

余子越的博客 1779

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

多线程,线程池,线程的创建,线程池的参数

​ 进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。线程也被称为轻量级进程,线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其它线程共享该进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

weixin_44797327的博客 1301

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

线程池和多线程的区别

线程池的概念 线程池大类总共分为4种 fixThreadPool 正规线程(传统线程池) cacheThreadPool 缓存线程池 singleThreadPoll 单线程线程池(单例线程池) ScheduledThreadPoll 周期性执行任务的线程池 fixThreadPool 正规线程(传统线程池) 含有核心线程,核心线程即为最大线程数量,没有非核心线程 cacheThr...

董皓宇 8779

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python 多线程与线程池

简单的多线程—使用线程池 from multiprocessing import Pool def f(x): # 基本函数返回 x的平方 return x * x def my_callback(x): # 回调函数,打印x print(x) def multicore(): pool = Pool(4) # 创建可容纳四个进...

红叶谷 wsp_1138886114的博客 4240

Linux多线程【线程池】

线程池是一种管理线程的机制,它可以在需要时自动创建和销毁线程,以及分配和回收线程资源。线程池的主要优点是减少了频繁创建和销毁线程所带来的开销,提高了系统的稳定性和可扩展性。此外,线程池还可以有效地控制线程的数量,避免过多线程导致的资源竞争和系统过载

北 海的博客 2541

多线程及线程池

多线程使用、常见线程并发解决方式、常见各种线程池及自定义线程池

m0_74751974的博客 809

java多线程及线程池

多线程是指在一个程序中同时运行多个线程,每个线程都是独立的执行流程,可以在同一时间内执行不同的任务,从而提高程序的并发性和效率。1、等待与睡眠Thread.sleep(long millis):使当前线程进入睡眠状态,直到指定时间过去或被中断。Object.wait():使当前线程等待,直到其他线程调用 notify() 或 notifyAll()。Thread.join():等待指定线程完成执行。2、I/O 操作。

yogima的博客 1097

多线程和线程池的区别

多线程是一种并发执行的技术,它允许在同一进程中同时执行多个线程。每个线程可以执行程序中的一部分代码,从而提高程序的执行效率。资源共享:同一进程中的多个线程共享进程的内存空间和资源,这使得线程之间的通信非常高效。并发性:多个线程可以同时进行,操作系统能够在多个线程之间快速切换,给用户提供并行处理的感觉。轻量级:相对于进程,线程是轻量级的,因为线程的创建和销毁比进程更快,并且线程之间的上下文切换成本较低。应用场景。

m0_63903713的博客 1292

Python 线程 多线程 线程池

多线程, 线程池测试: Python 使用多线程,有两种方式:函数,或者用类来包装线程对象。 现在有一个需求:如下图,我们需要把test.jpg 复制5000次到update文件夹下面。并且在复制过程中需要重命名,命名规则为 循环的当前次数.jpg  最后全部循环完成后,添加finish文件到update和result文件夹中。循环过程中如果碰到循环次数能整除10 的,需要把文件也写入到res...

wangliuqi123的博客 2569

【多线程4】线程池

介绍线程池的概念,如何实现线程池以及如何关闭

2301_80103650的博客 827

Java多线程、锁、线程池详解

通过本文的介绍,我们深入了解了Java中的多线程、锁机制、线程池的原理和应用。多线程可以提高程序的执行效率,但同时也带来了线程安全的问题。锁机制可以解决线程安全问题,而线程池则可以提高线程的复用率,减少线程创建和销毁的开销。理解这些概念的原理和应用可以帮助开发者编写高效、可靠的并发程序。希望本文能够帮助大家更好地理解和掌握Java中的多线程、锁和线程池,提升编程水平。

weixin_67825126的博客 2135

java 多线程,线程池

java多线程, 线程池

一人码农 1268

在java中如何设置多个线程池_Java多线程之线程池浅析

多线程是Java开发中的一个重要的领域,诚如我们所知道的,Java共有四种多线程的实现方式,第一种是集成Thread类,第二种是实现Runable接口(无返回值、不抛异常),第三种是实现Callable接口(有返回值、抛异常),第四种是通过线程池实现,本文主要介绍通过线程池的方式实现多线程。一、为什么要使用线程池、优势是什么?线程池的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在...

weixin_42212965的博客 4022
上一篇: 多线程--单例模式and工厂模式
下一篇: 多线程--关于锁的一些知识考点
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值