Java面试八股之线程池是怎么实现的

  1. 线程池是怎么实现的

线程池是一种基于池化技术的线程管理方式,通过预先创建一定数量的线程并保持在池中待命,从而在有任务来临时能够快速分配线程处理任务,而无需频繁创建和销毁线程,以此达到提升系统性能、减少资源消耗的目的。

Java中的线程池实现 -ThreadPoolExecutor

Java中最常用的线程池实现是java.util.concurrent.ThreadPoolExecutor类,它实现了ExecutorService接口。ThreadPoolExecutor的设计围绕着几个关键组成部分:

corePoolSize(核心线程数):

定义了线程池中的常驻核心线程数。即使这些线程当前是空闲的,它们也会一直存在,除非设置了allowCoreThreadTimeOut为true,此时核心线程在空闲时也会超时终止。

maximumPoolSize(最大线程数):

表示线程池能够容纳同时执行的最大线程数,包括核心线程和非核心线程。当活动线程数达到这个值后,新任务将会被阻塞或拒绝。

keepAliveTime(空闲线程存活时间):

当线程数超过核心线程数时,超出的空闲线程在等待新任务的最长时间。达到这个时间后,多余的空闲线程会被终止,直到线程数减少到核心线程数。

unit(存活时间单位):

用于指定keepAliveTime参数的时间单位,例如TimeUnit.SECONDS(秒)、TimeUnit.MILLISECONDS(毫秒)等。

workQueue(工作队列):

用于保存待处理的任务队列。当线程池中的线程数目达到最大值时,新提交的任务会存储在这个队列中等待执行。JDK提供了多种队列实现,如ArrayBlockingQueue(有界队列)、LinkedBlockingQueue(可选边界队列,默认情况下是无界的)、SynchronousQueue(直接交换,通常用于无缓冲的生产者-消费者场景)和PriorityBlockingQueue(带优先级的队列)。

threadFactory(线程工厂):

用于创建新线程的工厂,可以用来设置线程的优先级、线程组、名称等属性。如果不指定,默认使用Executors.defaultThreadFactory()。

handler(拒绝策略):

当线程池和任务队列都达到饱和时(即无法再接受新任务),用于处理额外任务的策略。有四种预定义的策略:

AbortPolicy:默认策略,抛出RejectedExecutionException异常。

CallerRunsPolicy:调用者运行任务的策略,即提交任务的线程自己执行该任务。

DiscardPolicy:静默丢弃无法处理的任务,不抛出异常。

DiscardOldestPolicy:丢弃队列中最旧的任务,并尝试重新提交当前任务。

实现原理简述

任务提交:当一个新任务通过execute()方法提交给线程池时,线程池首先会尝试直接将任务交给核心线程执行。

线程创建与任务调度:如果核心线程都在忙且任务队列未满,则新任务会被放入任务队列等待。如果任务队列已满,且当前线程数小于最大线程数,那么会创建新的线程来执行任务。

线程回收:当线程池中的线程数量超过核心线程数并且有线程空闲超过keepAliveTime时,这些空闲线程会被终止,直到线程数量降到核心线程数。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐《从零开始大模型开发与微调》

大模型是深度学习是当前AI和NLP研究与产业中最重要的方向之一。 本书用PyTorch 2.0作为学习大模型的基本框架,以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术,为读者揭示大模型开发技术。 《从零开始大模型开发与微调&…

Windows10映射网络驱动器之后不显示映射盘

目录 背景解决步骤1、按 Windows R 打开运行2、打开注册表编辑器3、 System上新建-- DWORD(32bit)4、对新建的文件重命名5、将EnableLinkedConnections的数值改为16、退出注册表编辑器,重启系统。 知识扩展断开连接备份注册表 背景 目前有一台NAS服务器,和一台lin…

工厂模式的三种实现方式

文章目录 1.引出工厂模式具体需求 2.传统模式1.类图2.目录结构3.pizzastore 用于设计pizza1.Pizza.java 抽象的Pizza类型2.CheesePizaa.java CheesePizaa3.GreekPizza.java GreekPizza 4.order 用于订购和制作pizza1.OrderPizza.java 制作pizza2.PizzaStore.java 订购pizza 5.优…

【Redis】 关于列表类型

文章目录 🍃前言🍀常见操作命令介绍🚩lpush🚩lpushx🚩rpush🚩rpushx🚩lrange🚩lpop🚩rpop🚩lindex🚩linsert🚩llen🚩lrem&…

“按摩”科技?

都说A股股民是特别善于学习的,这不市场又现新概念——“按摩科技”,成立仅6年,把上门按摩干到35亿营收也是没谁了,现在号称有1000万用户,3万家入驻商户数的按摩平台,难道就凭借2.5万名女技师,活…

【Django】中间件实现钩子函数预处理和后处理,局部装饰视图函数

在app文件夹里新建middleware.py继承MiddlewareMixin, 编写中间件类,重写process_request、process_response钩子函数 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…

关于pytest中用例名称使用中文乱码的解决

场景:使用pytest.mark.parametrize装饰器为用例自定义名称时,运行显示乱码。如下图所示: 解决方案: 1.在根目录 pytest.ini中增加一行代码 [pytest] disable_test_id_escaping_and_forfeit_all_rights_to_community_supportTrue…

NAT 网络转换

NAT(Network Address Translation) 网络地址转换 0x01 NAT 简介 为什么要使用 NAT IPv4 网络地址紧缺,从而出现了私有网段,来补充地址,但私有网段不课访问 internet 所以出现了 NAT 地址转换,将私有地址,转换为公网 I…

一口气看完es(上)

此系列博客分为上中下3篇:上篇是关于es的概念和对数据的增删改操作,中篇是对数据的查询、对搜索结果进行处理操作,下篇是介绍怎么在Java代码中调用和操作es。 基本概念 1、es是什么?有什么作用? es全名是elasticsea…

关于0成本部署个人博客

分享一个文章关于零成本搭建个人博客 参考:‘关于部署博客hexoshokagithub的流程以及问题’ - 关于博客部署 | XiaoYang Guo Welcome to Guo Xiaoyangs personal blog 欢迎来到郭晓阳的个人博客 (1330303.github.io) 这个博主讲的流程很全,而且回答也…

智慧管廊巡检运维解决方案

一、智慧管廊巡检行业目前存在的挑战和难题 智慧管廊巡检行业面临着运行环境的客观影响,如地面施工、液体渗漏、通风不佳、内部空间受限等问题。而管廊巡检机器人系统的出现却具有重大意义。它能够有力地保障管廊安全且可靠地运行,在面对火情、灾情等紧…

springboot基础篇(快速入门+要点总结)

目录 一、SpringBoot简介 二、创建SpringBoot(通过Idea脚手架搭建项目) 三、properties配置文件 properties 配置文件说明 ①. properties 基本语法 ②. 读取配置⽂件 ③. properties 缺点 2. yml 配置⽂件说明 ①. yml 基本语法 ②. yml 使用进…

上海AI lab发布MathBench,GPT-4o的数学能力有多强?

大模型数学能力哪家强? 最近,上海AI lab构建了一个全面的多语言数学基准——MathBench。与现有的基准不同的是,MathBench涵盖从小学、初中、高中、大学不同难度,从基础算术题到高阶微积分、统计学、概率论等丰富类别的数学题目&a…

【Linux】升级make(版本4.4.1)、升级gdb(版本14.1)、升级autoconf(版本2.71)

centos7升级make(版本4.4.1): make:编译和构建工具。Linux中很多软件包需要make编译构建。官网:Make - GNU Project - Free Software Foundation 本次升级前的make版本是3.82,准备安装的版本是4.4.1。make…

【Delphi 开箱即用 4】动态切换主题皮肤(明亮 or 暗黑)

Delphi的原始窗口界面看起来并不够吸引人。尝试下载并安装第三方皮肤可能会导致应用程序尺寸急剧增加,并且可能会出现不稳定的情况。事实上,Delphi自带了皮肤功能,完全可以满足我们对窗口界面的美化需求,并且还支持动态切换皮肤。…

Python I/O操作笔记

打开文件: 使用 open() 函数,其中文件路径可以是相对路径或绝对路径。 模式除了常见的 r(只读)、w(写入,会覆盖原有内容)、a(追加)外,还有一些其他组合模式&…

基于springboot实现旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在…

来自Java的“菱形继承“,你听说过吗?

一、菱形继承的概念 菱形继承又叫做钻石继承,指的是不同的类同时继承自相同的父类,存在一个子类同时继承这些不同的类,即我们常说的“多继承”问题。 例如:B类和C类分别继承A类,而D类同时继承B类和C类。 如此图所示 二…

Oladance、韶音、南卡开放式耳机选哪个?2024年主流产品硬核测评!

近期,不少朋友向我咨询关于挑选开放式耳机的建议,希望找到既适合自己又具有高品质的选项。鉴于市场上开放式耳机品牌繁多,每款产品在音质、佩戴感受及整体性能上的表现各有千秋,正确选择一款耳机成为了音乐爱好者们关注的焦点。错…

R绘图学习笔记

1、R语言绘制海岸线边界 参考: Drawing beautiful maps programmatically with R, sf and ggplot2 — Part 1: Basics 使用R绘制世界地图及纬度统计图 Drawing maps with R. A basic tutorial:https://dr2blog.hcommons.org/2020/03/23/drawing-maps-wit…