线程池 01

线程池的工作原理01 文章摘要: 本文深入探讨了并发编程中的线程池实现技术,重点分析了生产者-消费者模型、RAII机制和并发编程原语三大理论基础。生产者-消费者模型通过任务队列实现任务提交与执行的解耦,解决互斥访问、条件等待等并发问题。RAII机制确保了资源的自动化管理,是异常安全的关键保证。文章详细阐述了原子操作、内存序等并发原语,并说明了线程池在高并发服务、异步任务处理等场景中的核心价值:通过线程复用降低资源消耗、任务缓冲提高响应速度,以及可控并发保障系统稳定性。最后总结了线程池的经典工作流程和资源分配决策机制。 阅读详情

为什么使用线程池

管理多个线程,让其并发或者排队。
减少新创建线程的时间空间开销。
如果线程池空闲时,减少任务新创建线程的开销,即来即用。

风险

同步错误

  • 死锁
    2个线程互相持有需要的锁
  • 资源不足
    如果有很多线程,环境切换也可能严重地影响程序的性能。
    除了线程自身所使用的资源以外,服务请求时所做的工作可能需要其它资源,例如 JDBC 连接、套接字或文件。这些也都是有限资源,有太多的并发请求也可能引起失效,例如不能分配 JDBC 连接。
  • 并发错误
    线程池和其它排队机制依靠使用 wait() 和 notify() 方法,这两个方法都难于使用。如果编码不正确,那么可能丢失通知,导致线程保持空闲状态,尽管队列中有工作要处理。使用这些方法时,必须格外小心。而最好使用现有的、已经知道能工作的实现,例如 util.concurrent 包。
  • 线程泄漏
    线程发生 error,抛出 RuntimeException 或一个 Error 时。如果池类没有捕捉到它们,那么线程只会退出而线程池的大小将会永久减少一个。直到线程池为空。

使用准则

  • 尽量不要对那些同步等待其它任务结果的任务排队。防止死锁。
  • 时间可能很长的操作使用合用的线程时要小心。
    如果程序必须等待诸如 I/O 完成这样的某个资源,那么请指定最长的等待时间,以及随后是失效还是将任务重新排队以便稍后执行。
    这样做保证了:通过将某个线程释放给某个可能成功完成的任务,从而将最终取得某些进展。
    ???? 指定等待时间?
  • 理解任务。 线程池大小。
    正在排队任务的任务正在做什么?
    瓶颈是CPU 限制的吗?还是 I/O?
    您的答案将影响您如何调整应用程序。如果您有不同的任务类,这些类有着截然不同的特征,那么为不同任务类设置多个工作队列可能会有意义,这样可以相应地调整每个池。

线程池大小设置

避免:线程 太少 或 太多。

  • 线程池的最佳大小取决于可用处理器的数目以及工作队列中的任务的性质。
    若在一个具有 N 个处理器的系统上只有一个工作队列,其中全部是计算性质的任务,在线程池具有 N 或 N+1 个线程时一般会获得最大的 CPU 利用率。

  • 对于那些可能需要等待 I/O 完成的任务(例如,从套接字读取 HTTP 请求的任务),需要让池的大小超过可用处理器的数目,因为并不是所有线程都一直在工作。通过使用概要分析,您可以估计某个典型请求的等待时间(WT)与服务时间(ST)之间的比例。如果我们将这一比例称之为 WT/ST,那么对于一个具有 N 个处理器的系统,需要设置大约 N*(1+WT/ST) 个线程来保持处理器得到充分利用。

一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的核数)
如果是CPU密集型应用,则线程池大小设置为N+1
如果是IO密集型应用,则线程池大小设置为2N+1

结论:设置 N +1 个线程
服务器端 与 移动端

//参数初始化
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

常用的几种线程池

newCachedThreadPool

一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

  • 线程池为无限大(其实也有限制的,数目为Interger. MAX_VALUE),当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
  • 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
  • 在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

newFixedThreadPool

指定工作线程数量的线程池。
如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
优点:
它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。
缺点:
在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。

newSingleThreadExecutor

创建唯一的工作者线程来执行任务。
它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
如果这个线程异常结束,会有另一个取代它,保证顺序执行。

newScheduleThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

参考文章

https://www.cnblogs.com/aaron911/p/6213808.html
https://www.cnblogs.com/zhujiabin/p/5404771.html

2021版Java线程池教程01:什么是线程池?为什么要使用线程池? 2021版Java线程池教程 全集 2021版Java线程池教程 2021版Java多线程教程 代码 Task.class package main; public class Task implements Runnable { @Override public void run() { System.out.println(Thread.curre... 阅读详情

相关推荐

Codex辅助小说创作:零成本AI写作指南与实战技巧

自然语言处理技术通过深度学习模型理解语义上下文,其核心原理是基于大规模文本训练的语言模型预测能力。在创意写作领域,这项技术的价值在于突破传统写作工具的功能局限,实现从内容生成到风格模仿的智能化辅助。特别是提示词工程的应用,让创作者能够精准控制AI输出的内容和风格。在实际应用场景中,AI写作工具显著降低了小说创作门槛,适用于网络小说、奇幻科幻等多种文学类型。本文以OpenAI Codex为例,详细解析如何利用AI技术完成从故事大纲设计、章节生成到平台发布的全流程创作,其中提示词优化和内容质量把控是提升生成效果

weixin_32678995的博客 560

【Java线程池01】Java线程池简介

【Java线程池01】Java线程池简介背景此系列为Java线程池(ThreadPoolExecutor)源码学习与总结系列,JDK源码版本:JDK1.7。参考文章:http://blog.youkuaiyun.com/liuguangqiang/article/details/52169926意义线程池,顾名思义一个线程的池子,池子里存放了很多可以复用的线程,如果不用线程池类似的容器,每当我们需要创建新的线...

龙腾四海365的专栏 768

STM32与HT7038的高精度电能计量系统设计与实现

本文详细介绍了基于STM32微控制器与HT7038三相电能计量芯片的高精度电能计量系统设计与实现。文章从项目选型出发,深入剖析了硬件电路设计、SPI驱动开发、芯片校准及系统集成等关键环节,为智能电表、能源监控等应用提供了高性价比且稳定的国产化解决方案。

pytorch8learner的博客 389

线程池01

线程池定义:线程池的原理:线程的缺点:线程池的优点:创建方式(7种):方式1: 创建固定个数的线程池自定义线程池行为:方式2: 创建带缓存的线程池方式3: 创建可以执行定时任务的线程池方式4: 创建单个执行定时任务的线程池方式5: 创建单个线程的线程池方式6:(JDK8+) 创建单个线程的线程池方式7: 定义: 使用 池化技术来管理和使用线程的技术。 线程池顾名思义就是事先创建若干个可执行的线程放入一个池( 容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销

DavenportChen的博客 557

matlab球面投影(二)

matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z,

rjszcb的博客 3161

多孔材料吸附性质模拟程序RASPA的离线和在线安装方法

RASPA-2.0是今年美国西北大学教授Randall Q. Snurr等人开发的针对于MC,MD,分子力学优化等用途的程序,相比于之前开发的MUSIC软件,RASPA的功能更加齐全,操作更加简便,可以在MC的吸附过程中考虑骨架的柔性,也可以想MUSIC一样先制作积分格点(music中的map)。 A、离线安装(centos为例): (1)、安装之前要检查一下是否装了automake,

youyno的博客 1万+

线程池_初步认识_01

线程池 线程池_初步认识_01一、定义管理一组工作线程。二、好处1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗,比如内存;2. 提高响应速度。任务到达时,可以不需要等到线程创建就能执行;3. 提高线程的可管理性。通过线程池,实现对线程的统一分配,调优和监控;比如可以避免无线创建线程引起OutOfMemoryError。三、实现原理当向线程池提交一个任务之后,线程池是如何处理这个任务的呢?上图就是线程池的主要处理流程;ThreadPoolExecutor 执行exe...

wind1_rain的博客 372

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6687

线程池_01

三大方法 Executor: - newSingleThreadExecutor()//单个线程 - newFixedThreadPool()//固定线程池大小 - newCachedThreadPool()//可伸缩大小的线程池 本质ThreadPoolExecutor() 七大参数 public ThreadPoolExecutor(int corePoolSize,//1:核心 int maximumPoolSize,//2最大

weixin_42044885的博客 146

4D Gaussian Splatting for Real-Time Dynamic Scene Rendering-4DGS阅读笔记

为了实现实时动态场景渲染,同时还能具备较高的训练和存储效率,作者提出了四维高斯溅射(4D-GS)方法,将其作为动态场景的一种整体表示方式,而不是对每个单独的帧应用三维高斯溅射(3D-GS)方法。在 4D-GS 中,提出了一种新颖的显式表示方法,它同时包含三维高斯模型和四维神经体素。受 HexPlane 启发,提出了一种分解的神经体素编码算法,以高效地从四维神经体素构建高斯特征,然后应用一个轻量级多层感知器(MLP)来预测在新时间戳下的高斯变形。

2403_85515624的博客 2343

机理模型与数据模型融合的方式

风电场的发电量受到多种因素的影响,包括但不限于风速、温度、空气密度等。尽管这些环境变量可以直接测量并用作模型输入,但它们与发电量之间的关系往往是复杂的非线性关系。通过引入基于物理定律计算出的理论发电量作为额外特征,可以为数据驱动模型提供更丰富的信息,从而提高预测精度。在这个案例中,我们将使用贝茨理论(Betz Limit)来计算风电场的理论发电量,并将其作为一个新的特征添加到数据集中。然后,我们使用增强后的数据集训练一个简单的神经网络模型来进行发电量预测。

金石软件 4805

Java 线程池 ThreadPoolExecutor -01

感谢 参考: http://www.cnblogs.com/trust-freedom/p/6681948.html https://www.jianshu.com/p/ae67972d1156 一、为什么使用线程池 创建和销毁线程伴随着系统的开销,过于频繁的创建/销毁x线程 会很大程度上影响处理效率 线程并发数过多,抢占系统资源可能会导致阻塞 想对线程进行简单的管理 二、线程池作用 线程池作...

qq_36291682的博客 3096

JavaFx 教程

JavaFx 教程

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 784

通俗易懂理解线程池【01】

线程池

localhost65535的博客 749

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

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

Java线程池01之ThreadPoolExecutor

1. 介绍 用来创建线程池 2. 参数说明 参数 说明 corePoolSize 核心线程数 maximumPoolSize 最大线程数 keepAliveTime 超过corePoolSize,allowCoreThreadTimeOut(true)也可以设置核心线程数的超时时间 TimeUnit keepAliveTime时间单位 workQueue 阻塞任务队...

徐海兴的专栏 291

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java线程池详解(01)

什么是线程池? 线程池:顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程,而是返回池中从而减少创建和销毁对象对CPU和内存的开销. 例如:线程池的概念类似人才资源中心,原本每次要运行一个线程(公司找一个员工)都必须去创建(培养)一个员工才行,有了线程池之后就在线程池中准备了多个创建好的线程(培...

weixin_41821522的博客 266

数学建模模型总结

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

Java线程池入门01

线程池是一种池化思想管理线程的工具。

StarPlatinum2的博客 200

C++线程池Day01

同步原语:std::mutex和std::condition_variable. 作用是协调工作线程和任务提交者。T::something一般会认为是一个值,所以这里要加typename告诉编译器T::type是一个类型,不是一个值。T推导为std::string,在函数f的栈上构造arg对象,临时对象std::string("hello")的内容被移动到arg.对于f(s),std::forward是没有意义的:因为已经发生了拷贝:成本最高的操作已经完成了。另外,Args是和可调用对象F绑定的参数。

Kevincxt的博客 512

01线程池原理剖析

01线程池原理剖析 1 为何需要线程池? 我们知道,多路IO转接是可以支持多个客户端的连接与处理,举例poll解释,他可以一次监听到多个客户端请求返回,并遍历confd数组进行处理,也就是说,Server是直接进行处理的;再看epoll,他是有请求就给你建立连接,并且设置为非阻塞是非常高效的,不需要立马就处理请求。因为它有回调函数帮忙进行处理,但实际上仍然是Server自己处理。如果客户端非常活跃的情况下,导致很多回调函数处理,也是非常耗时的,所以epoll比较支持多连接,少活跃的情况。 那么我们能不能建立

weixin_44517656的博客 272

01_线程池概念和自定义线程池

线程池概念和自定义线程池

w7635122886的博客 195

线程池01--基础使用

java 线程池 基本使用

fengxianaa的博客 197

java线程池笔记-理解线程池入门01

需求:用线程池吧atomicInteger 累加到1k,使用3个线程分别完成,利用到原子类atomicInteger 我最近发现的线程池原来是这样用的,以前用的线程池用法问题特别大,会导致用了40~70GB内存,并且导致服务器64核心的CPU全核全干满了100%,这次特别记录一下

weixin_46028606的博客 541

01-并发编程之Executor线程池详解

目录 线程 线程定义 多线程定义 线程实现方式 线程的生命周期&状态 线程如何排查死锁 线程的运行顺序 线程池 1.线程池和线程对比性能测试 2.体系介绍 3.普通线程池ThreadPoolExecutor结构 4.线程池运行思路 一、线程 1. 线程: 线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只...

小白的学习之路 381

Java并发编程-线程池(01)

本篇文章主要是通过模拟实现自定义线程池来阐述Java并发编程中线程池的基础思想和基本实现方式。文章开篇介绍了池化思想的概念和线程池的重要性,接着通过模拟实现Java线程池来展示了线程池中的任务队列、超时设置、拒绝策略等知识点,同时也展示了一些拒绝策略的设计。

ikun的博客 1903

[03][01][08] 线程池的实现原理分析

文章目录什么是线程池线程池的优势Java 中提供的线程池 API线程池的使用Java 中提供的线程池 ApiThreadpoolExecutornewFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutor线程池的实现原理分析线程池原理分析(FixedThreadPool)源码分析executectl 的作用状态转化addWorkerWorker 类说明addWorkerFailedrunWorker 方法processWorkerExitexecu

安全新司机 198
上一篇: 07 | 08 启动优化:从启动过程看启动速度优化——学习总结
下一篇: 00 | 移动开发 提纲
阿杰、
博客等级 码龄11年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值