线程池工作原理

article/2025/10/7 10:12:41

一、线程池默认工作流程

1、线程在有任务的时候会创建核心的线程数corePoolSize

2、当线程满了(有任务但是线程被使用完)不会立即扩容,而是放到阻塞队列中,当阻塞队列满了之后才会继续创建线程。

3、如果队列满了,线程数达到最大线程数则会执行拒绝策略。

4、当线程数大于核心线程数事,超过KeepAliveTime(闲置时间),线程会被回收,最终会保持corePoolSize个线程。

二、五种实现

1、newSingleThreadExecutor()

池里只有一条线程,如果线程因为异常而停止,会自动新建一个线程补充

2、newFixedThreadPool()

创建一个核心线程数跟最大线程数相同的线程池,线程池数量大小不变,如果有任务放入队列,等待空闲线程。

3、newCachedThreadPool()

线程池是创建一个核心线程数为0,最大线程为Inter.MAX_VALUE的线程池,线程池数量不确定,有空闲线程则优先使用,没用则创建新的线程处理任务,处理完放入线程池。

4、newScheduledThreadPool()

创建一个没有最大线程数限制的可以定时执行线程池,还有创建一个只有单个线程的可以定时执行线程池(Executors.newSingleThreadScheduledExecutor())

三、七个核心参数

1、七个参数
corePoolSize: 线程池核心线程个数

workQueue:用于保存等待执行任务的阻塞队列

maximunPoolSize: 线程池最大线程数量

ThreadFactory: 创建线程的工厂

RejectedExecutionHandler: 队列满,并且线程达到最大线程数量的时候,对新任务的处理策略

keeyAliveTime: 空闲线程存活时间

TimeUnit: 存活时间单位
线程的拒绝策略

2、CPU密集型

获得cpu的核数,不同的硬件不一样,设置核数的的线程数量。

我们可以通过代码Runtime.getRuntime().availableProcessors();获取,然后设置。

3、IO密集型

IO非常消耗资源,所有我们需要计算大型的IO程序任务有多少个。

一般来说,线程池最大值 >
大型任务的数量即可

一般设置大型任务的数量*2

4、线程池大小= 最大线程数 + 阻塞队列大小

5、LinkedBlockingQueue给put(放入元素),take(取元素)都声明了一把锁,放入和取互不影响,效率更高。
在这里插入图片描述

6、ArrayBlockingQueue 使用数组实现,在声明的时候必须指定长度,如果长度太大,造成内存浪费,长度太小,并发性能不高,如果数组满了,就无法放入元素,除非有其他线程取出元素,放入和取出都使用同一把锁,因此存在竞争,效率比LinkedBlockingQueue低
在这里插入图片描述

四、四种策略

1、AbortPolicy(被拒绝了抛出异常)

2、CallerRunsPolicy(使用调用者所在线程执行,就是哪里来的回哪里去)

3、DiscardOldestPolicy(尝试去竞争第一个,失败了也不抛异常)

4、DiscardPolicy(默默丢弃、不抛异常)

五、拒绝策略执行则么办?

1、另外创建一个队列,当拒绝策略执行将任务放入队列。

通过定时任务去每隔一秒去查看线程池队列中是否有任务,没有则添加进去。

缺点: 任务会丢失,线程优雅关闭是指正常情况队列执行晚。会关闭。如果用这种方法创建则会丢失任务。

2、如果 是特别重要的话就 放入DB去持久化,给任务加个状态,通过状态来判断任务的执行情况。

3、其他情况要根据场景考虑 比如又些任务过期淘汰


http://chatgpt.dhexx.cn/article/RbAdA76K.shtml

相关文章

线程池的工作原理

线程池,就是存放线程的池子,池子里存放了很多可以复用的线程 作用: 1.对线程进行统一管理 2.降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗 3.提高响应速度。当有任务到达时,无需等待新线…

线程池核心原理分析

一、基础概念 线程池是一种多线程开发的处理方式,线程池可以方便得对线程进行创建,执行、销毁和管理等操作。主要用来解决需要异步或并发执行任务的程序 谈谈池化技术 简单点来说,就是预先保存好大量的资源,这些是可复用的资源,你需要的时候给你。对于…

线程池原理(讲的非常棒)

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了&…

服务器常见的网络攻击以及防御方法

网络安全威胁类别 网络内部的威胁,网络的滥用,没有安全意识的员工,黑客,骇客。 木马攻击原理 C/S 架构,服务器端被植入目标主机,服务器端通过反弹连接和客户端连接。从而客户端对其进行控制。 病毒 一…

传奇服务器容易受到什么攻击,怎么防御攻击?

有兄弟问明杰,说自己打算开服,听说攻击挺多的,就是想先了解一下开传奇用的服务器最容易受到什么类型的攻击,如果遇到了又改怎么防御呢?带着这个问题,明杰跟大家详细的说一下,常见的开区时候遇到…

传奇服务器常见的网络攻击方式有哪些?-版本被攻击

常见的网络攻击方式有哪些?常见的网络攻击方式 :端口扫描,安全漏洞攻击,口令入侵,木马程序,电子邮件攻击,Dos攻击。 1.传奇服务器端口扫描: 通过端口扫描可以知道被扫描计算机开放了…

服务器被ddos攻击的处置策略

如果您的服务器遭到了DDoS攻击,以下是一些可以采取的措施: 使用防火墙和安全组进行限制:限制服务器的流量以防止进一步的攻击。 升级服务器资源:为了应对更高的流量,可以升级服务器的内存,处理器等资源。 安…

如何从根本上防止服务器被攻击

随着互联网的发展,服务器成为了企业和个人网络应用的重要基础设施。但是,随之而来的网络安全威胁也在不断增加,服务器安全问题也成为了影响企业信息安全的重要因素。针对这种情况,服务器安全防御变得尤为重要。   服务器安全防御…

来一起学怎么攻击服务器吧!!!

我们上线了两门新课。 一门教你漏洞的原理和攻击代码怎么写。 一门会教你木马的制作。 一如既往地,新课刚上线都是限时优惠状态,感兴趣的同学用力点击下面这两个妹子吧: Kali 渗透测试 - 服务器攻击实战 Kali 渗透测试 - 后门技术实战 提示&a…

网站服务器怎么做防御?遇到攻击如何解决?

每个网站都可能遇到网络攻击,这是正常现象。攻击可能来自密码错误、防火墙配置错误、病毒软件、空闲端口等。大量的网络攻击在竞争激烈的行业或企业中更为常见。 目前需要有一套完整的安全策略来保护流浪数据,防止网站服务器被攻击。完善可靠的安全策略…

服务器被攻击怎么办?常见处理方法

对于企业用户来,最害怕的莫过于服务器遭受攻击了,比如被大量登录、网页被篡改、数据库被非法登录、网络日志异常等,尽管运维人员在此之前做好了全面的防范工作,但攻击再所难免,如何在服务器遭受攻击后能够迅速有效的处…

服务器被DDoS攻击,怎么破?

文章目录 前言网站受到DDoS的症状判断是否被攻击查看网络带宽占用查看网络连接TCP连接攻击SYN洪水攻击 防御措施TCP/IP内核参数优化iptables 防火墙预防防止同步包洪水(Sync Flood)Ping洪水攻击(Ping of Death)控制单个IP的最大并…

黑客攻击入侵服务器的6种常见方式

服务器被入侵既有一定的偶然性,也有一定的必然性,网络上有两种黑客,一种是漫无目的的漫天撒网形式的黑客,一种是目标明确只入侵指定目标的黑客,我们称前一种黑客叫菜鸟黑客,称后一种黑客叫高级黑客。简单的…

web服务器攻击的八种方式

随着互联网的高速发展,网络走进了千家万户,同时也有很大一部分人架设起了自己的网站。继而不安分的黑客们,又将目光对准了服务器攻击这个方式,从而破坏或取得服务器的管理权限。本文将主要讲述针对web服务器攻击的八种方式。 1、…

Webpack--模块热替换(HMR)

一、概述 (1)live reload 只要检测到代码改动就会自动重新构建,然后触发网页刷新 (2)webapack中的模块热替换 可以让代码在页面不刷新的前提下得到最新的改动,甚至不需要重新发起请求就能看到更新后的效…

HMR API及其原理

很久之前,遇到一个面试题:【在代码变更之后,如何实时看到更新后的页面效果呢?】 在传统的方案中,我们可以通过 live reload 也就是自动刷新页面的方式来解决的,不过随着前端工程的日益庞大,开发…

webpack实践之路(七):模块热替换HMR

HMR 模块热替换(Hot Module Replacement 或 HMR)允许在运行时更新各种模块,而无需进行完全刷新。 HMR主要是通过以下几种方式,来显著加快开发速度: 保留在完全重新加载页面时丢失的应用程序状态。只更新变更内容,以节省宝贵的开…

【Webpack 性能优化系列(1) - HMR 热模块替换】

webpack系列文章: 【Webpack 性能优化系列(9) - 多进程打包】极大的提升项目打包构建速度!!!【Webpack 性能优化系列(8) - PWA】使用渐进式网络应用程序为我们的项目添加离线体验【Webpack 性能优化系列(7) - 懒加载和预加载】【…

hmr webpack 不编译_Webpack HMR 热更新实现原理深入分析

概述 在使用 Webpack 构建开发期时,Webpack 提供热更新功能为开发带来良好的体验和开发效率,那热更新机制是怎么实现的呢? 代码实现 Webpack 配置添加 HotModuleReplacementPlugin 插件 new webpack.HotModuleReplacementPlugin({ // Options…

webpack4.0核心概念(十)—— HMR(热模块替换-局部刷新)

HMR:当修改一个js或者css的时候,只刷新修改的内容,不进行整个页面的刷新。 css的HMR——只支持开发环境 不能使用mini-css-extract-plugin需要使用style-loader,因为它不支持抽离出的css,需要用style-loader ① 在webpack.config.js中配置 …