Java线程池原理和使用

Java 线程池(Thread Pools)详解 线程池是一种重用线程的机制,用于提高线程的利用率和管理线程的生命周期,常用于多线程编程和异步编程。Java提供了多种线程池实现,其中最常用的是ThreadPoolExecutor类和Executors类提供的静态工厂方法。线程池由一个线程队列和一个任务队列组成,线程队列中保存着空闲线程,任务队列中保存着等待执行的任务。线程池启动后,线程池中的线程从任务队列中获取任务并执行,执行完毕后返回线程队列中等待下一次任务的到来。如果任务队列为空,线程池中的线程将等待新的任务到来或被关闭。 阅读详情
什么是线程池?

线程池是Java线程的一种使用模式,通过池的思想对线程的创建和使用进行统一的管理。

为什么要用线程池?

Java线程是稀缺资源,频繁的创建和销毁会对CPU带来一定的开销,线程过多也会带来调度开销,不易维护和管理,进而影响缓存局部性和整体的性能。使用线程池可以对线程进行复用,避免了在处理短时间任务时创建与销毁线程的代价,还能防止过分调度,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。

线程池原理

线程池使用了池化技术,核心思想是把稀缺资源放到一个池子中进行统一管理,需要使用时从池中获取,使用结束后再放回到池中,供其他人使用。
了解了线程池的核心思想之后,我们一起来看看Java如何实现线程池。

1. 线程池的创建

Java创建线程池的方式主要有两种,一种是通过JDK1.5推出的Excutors类的静态方法进行创建,通过该类可以创建三种不同类型的线程池
(1)创建固定大小的线程池
在这里插入图片描述
(2)创建单个线程的线程池
在这里插入图片描述
(3)创建无限大小的线程池
在这里插入图片描述
使用Excutors静态方法创建线程池的优点是方便简单,而缺点也很明显,那就是不容易对线程池进行扩展。
另一种创建线程池的方式是直接使用ThreadPoolExecutor类创建
在这里插入图片描述
ThreadPoolExecutor构造器具备如下几个核心参数:

  • corePoolSize:线程池的核心线程数量。
  • maximumPooSize:线程池的最大线程数量。
  • keepAliveTime 和 unit: 线程池空闲存活时间和时间单位。
  • workQueue:存放任务的阻塞队列。
  • handler:当任务队列和最大线程数都满了之后所执行的拒绝策略。
线程池的工作流程

通过调用线程池的execute(Runnable r) 传递一个任务到线程池中,线程池接收到任务后,首先判断当前线程池的核心线程数是否已经达到最大值,如果未达到则创建一个线程执行该任务,反之判断当前任务队列是否已满,如果任务队列未满的话将该任务加入到任务队列中,等待后期的任务调度。否则再去判断当前线程池的总线程数是否达到最大值,如果未达到,创建一个线程执行任务。而如果核心线程数、任务队列、总线程数都达到饱和后、此时线程池无法在接收新的任务,将会执行拒绝策略,拒绝该任务进入到线程池中。
在这里插入图片描述
线程池中定义了物种线程状态,这些状态和线程的执行密切相关。
在这里插入图片描述
- RUNNING 运行状态,可以接收用户提交的任务和执行任务队列里的人物
- SHUTDOWN 调用shutdown()方法后,不再接收新任务,但需要将队列里的任务全部执行完。
- STOP 调用了shutdownNow()方法后,不再接收新任务,同时抛弃任务队列里的所有任务。
- TIDYING 在调用shutdown() 或 shutdownNow()方法后会尝试更新为当前状态,处于当前状态下线程池中执行的任务为空。
- TERMINATED 终止状态,当执行terminated()后会更新=为该状态。
状态转换路程如下
在这里插入图片描述

线程池的使用
ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 20, 30,
         TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        for (int i = 0; i < 20; i++) {
            pool.execute(new Runnable(){
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "正在运行");
                }
            });
            
        }
Java线程池(ThreadPoolExecutor)原理分析与使用 在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。使用线程池的好处1、降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性 阅读详情

相关推荐

网闸的基本配置

本文详细介绍了网闸的基本配置流程,包括物理连接与初始化、网络基础配置、核心数据交换策略配置、安全增强配置、管理与运维以及测试验证等关键步骤。网闸通过在物理隔离环境下建立"数据摆渡通道",实现特定业务数据的安全交换。配置时应遵循最小化、单向化、内容控制和审计原则,确保只开放必要通道,优先采用单向传输,进行内容安全检查并记录操作日志。不同厂商网闸的配置界面可能不同,但核心逻辑是相通的。

qq_39980997的博客 1842

java——线程池

一、线程池 线程池可以看做是线程的集合。它的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。 ​ 线程复用: 每一个 Thread 的类都有一个 start 方法。 当调用 start 启动线程时 Java 虚拟机会调用该类的 run 方法。 那么该类的 run() 方法中就是调用了 Runnable 对象的 run(

Pluto372的博客 1万+

拯救者Y9000P 2022双系统实战:Ubuntu22.04分区优化与驱动避坑指南

本文提供联想拯救者Y9000P 2022款安装Ubuntu 22.04双系统的详细实战指南。重点讲解针对该机型的磁盘分区优化方案、NVIDIA显卡驱动安装避坑技巧,以及安装后的网络、时间同步等必备配置,帮助用户高效完成双系统部署并提升使用体验。

weixin_29208327的博客 424

Java 线程池详解

线程池是一组已经初始化并等待执行任务的线程集合。通过使用线程池,我们可以避免频繁地创建和销毁线程,从而节省资源和减少系统开销。线程池的核心思想是通过复用线程来提高性能。

qq_41591215的博客 1万+

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 663

Docker部署OnlyOffice踩坑实录:解决editor.bin下载失败的3种姿势

本文详细解析了Docker部署OnlyOffice时editor.bin下载失败的常见原因,并提供了三种核心解决方案。重点剖析了容器网络配置、Nginx反向代理(特别是proxy_pass设置)以及安全策略调整,帮助开发者彻底解决静态资源加载问题,确保文档协作平台稳定运行。

weixin_29281941的博客 872

java线程池(简单易懂)

它最长的构造方法有七个参数。 核心线程数量——在线程池当中无论空闲多久都不会被删除的线程 线程池当中最大的线程数量——线程池当中最大能创建的线程数量 空闲时间(数值)——临时线程(线程池中出核心线程之外的线程)空闲了多久就会被淘汰的时间。 空闲时间(单位)——临时线程空闲了多久就会被淘汰的时间单位,要用枚举类TimeUnit类作为参数 阻塞队列——就是创建一个阻塞队列作为参数传入,就是当线程池当中线程数量已经达到了最大线程数量,允许多少个任务排队获取线程,其余的用参数七那个方案来处理。

qq_64680177的博客 9611

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

JAVA线程池详解

最全java线程池详解,看这一篇就够了...

ZHANGLIZENG的博客 1万+

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值)【含Matlab源码 4887期】

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值) 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 811

ABAP 百科全书的阅读目录(2024版)

909 篇 ABAP 技术文章的目录

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4246

java 线程池的原理以及使用

java 线程池的原理以及使用

zhouguizhi 796

qt项目中添加 jsoncpp 库

qt使用jsoncpp库

deroy 1349

Java线程池原理以及使用

Java线程池的核心在于线程复用和任务队列管理,通过合理配置核心线程数、最大线程数、队列容量和拒绝策略来优化性能。关键点包括:区分CPU密集型和IO密集型任务设置线程数、使用有界队列防止OOM、自定义线程工厂便于监控、正确处理任务异常。需特别注意避免使用Executors默认工厂方法,而应手动创建ThreadPoolExecutor,并关注线程泄漏、死锁风险等问题。最佳实践包括压力测试调优、实施监控告警以及实现优雅关闭机制。

初心未改 851

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

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

Java线程池的运行原理以及使用详解

一、 为什么要使用线程池 在一些需要使用线程去处理任务的业务场景中,如果每一个任务都创建一个线程去处理,任务处理完过后,把这个线程销毁,这样会产生大量的线程创建,销毁的资源开销。使用线程池能有效的控制这种线程的创建和销毁,而且能够对创建的线程进行有效的管理。 二、Java线程池相关的API介绍 1. Executor接口 主要是用来执行提交的任务。下面是接口定义: public in...

zw19910924的专栏 8667

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JAVA线程池的原理及使用

JAVA线程池的原理及使用一,使用线程池的原因二 ThreadPoolExecutor类的介绍1、构造方法合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart...

瓶子君的博客 315

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java线程池的使用及原理分析

概述         线程池是管理一组同构工作线程的资源池。合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,...

宋铮的博客 2969

Java线程池原理及使用

java中的线程池是运用场景最多的并发框架。在开发过程中,合理的使用线程池能够带来下面的一些好处: 1、降低资源的消耗。 2、提高响应速度。 3、提高线程的可管理型。 1.1、线程池ThreadPoolExecutor工作原理 讲解之前,我们先看一张原理图 ThreadPoolExecutor执行execute方法有4种情况: 1)如果当前运行的线程少于corePoolSize,则创建新的线程来...

好好学java 1万+

【Java 多线程】线程池 —— 详解线程池原理和使用

Java线程池是运用最多的并发框架,学号多线程以及合理的使用多线程可以带来很大的好处,今天就来一起学习线程池相关的知识吧! 线程池一、线程池的实现原理二、使用线程池1. 使用线程池的好处2.线程池的创建3. 向线程池提交任务4. 关闭线程池 一、线程池的实现原理 当向线程池提交一个任务后,线程池会怎么做呢? 首先线程池会在核心线程corePoolSize中找是否都在执行任务,如果不是,就创建...

Moo_Lavender的博客 604

Java线程池的使用和原理

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线...

Embrace Change 84

Java线程池实现原理和使用

一、基本概念 1.1解决的问题 线程池本质解决的问题是线程生命周期开销和资源不足问题,在大流量和高并发情况下,系统不确定在任意时刻有多少线程需要执行,需要多少资源需要投入,不合理的使用和管理,会带来以下若干问题: 无限创建线程,导致系统资源耗尽; 频繁的创建、销毁线程对cpu系统的消耗更大,系统性能降低; 系统稳定性无法保障低,因为无法管理线程资源分布; 1.2如何解决 线程池采用“池化(Pooling)”思想,将线程资源统一在一起管理,通过构建一个生产者消费者模型,将实际执行的线程和提交的任务

mrb1289798400的博客 603

java线程池原理及使用和处理流程

ThreadPool、线程池原理、线程池使用、ExecutorService使用

myzksky的专栏 259

Java线程池深度解析:从使用到原理

Java线程池是并发编程的核心组件,正确的使用和配置对系统性能至关重要。通过理解其工作原理、合理配置参数、实现有效监控,可以构建出高效稳定的并发处理系统。记住:没有万能的配置,最好的线程池配置总是基于具体的业务场景和性能测试结果。

lyx20020823的博客 874

java线程池的使用及实现原理

1、介绍 不使用线程池面临的问题 众所周知,java中线程的创建、切换、销毁都是比较消耗计算机资源的,若是线程执行的任务逻辑比较简单,创建、销毁线程消耗的计算机资源可能大于任务本身。特别是频繁的创建大量的线程,大量的线程在上下文切换的同时,系统也可能变得不稳定。 线程池优点 减少资源消耗:通过线程复用,避免重复创建、销毁线程造成额外的资源消耗。 提高响应速度:任务到达时,已有线程直接执行任务,无需实时创建线程造成的时间消耗。 资源上限管理:线程池的大小是预设的,避免系统无上限创建线程造成内存溢出。 2、

xiao_yu_gan的博客 661

Java线程池全面解析:原理、使用与最佳实践

Java线程池全面解析:原理、使用与最佳实践

2501_91537435的博客 1082
上一篇: Vue项目使用npm install下载依赖报错: ERR! notarget No matching version found for XXXX
下一篇: Java线程池拒绝策略(JDK内置)
小码林marlin
博客等级 码龄9年 30粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值