Java面试篇基础部分-Java线程池工作原理

news2025/2/22 10:02:13

  线程池的出现,主要是用来管理一组线程的工作运行状态,这样可以方便JVM更好的利用CPU资源。

  Java线程池的工作原理:JVM先根据用户的参数创建一定数量的可运行的线程任务,并且将这些任务放入到队列中,在线程创建之后,启动这些任务。

  如果当线程数超过最大线程数,这个线程数是由用户在创建线程池的时候进行设计的。对于超过数量的线程来说进行等候排队,等待其他线程执行完毕之后,线程池会发现可用的线程,进行再次从队列中获取到任务并执行。

  线程池的主要作用是线程复用、线程资源管理、控制操作系统的最大并发数量,从而保证系统的高效运行,这个高效运行时通过线程池内部的资源重复利用来实现。并且通过控制最大并发数保证系统资源的合理利用。

线程的复用

  如果我们对于线程进行抽象的话,那么每个Thread类都有一个start()方法,在程序调用到start方法之后线程启动,JVM会调用这个类的run方法。之前提到过,Thread类的run方法其实调用了Runnbale的run方法。所以,继承了Thread类,在start方法中不断循环调用传入的Runnable对象,程序就不断的执行run方法中的代码。

  这样的话可以将方法中的Runnbale对象,放入到一个Runnbale的队列中,当线程在获取到下一个Runnbale对象的时候可以进行阻塞,这样可以控制正在执行的线程的数量,也可以有效的保证系统中的线程等待其他正确的线程执行完毕,这样的一个机制就是线程池,可以对队列以及创建的线程资源进行重复的利用。多个Runnbale可以被一个Thread对象重复调用start方法来执行。

线程池的核心组件和核心类

  Java中的线程池有如下的几个核心组件组成

  • 线程池管理器:用于创建并且管理线程池
  • 工作线程:线程池中正在执行的具体的任务的线程
  • 任务接口:用来定义工作线程如何调度,如何执行,线程实现了这个接口,才能被线程池认可,进入线程池的管理调度。
  • 任务队列:用来存放需要处理的等待任务,新任务会不断地进入到队列中进行等待,执行完成之后任务会被从队列中移除

  Java中线程池机制是通过Executor框架进行实现的
在这里插入图片描述
  在框架中用到Executor、Executors、ExecutorService、ThreadPoolExecutor、Callable、Future、FutureTask一些核心类。其中,ThreadPoolExecutor 是用来构建线程的核心,代码如下

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
   
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

  这个类的构造方法有如下几个参数

  • corePoolSize:线程池中核心线程的数量
  • maximumPoolSize:线程池中最大线程的数量
  • keepAliveTime:当前线程数量超过corePoolSize的时候,空闲线程存活时间
  • unit:keepAliveTime的时间单位
  • workQueue:任务队列,已经提交但未被执行的任务存放的空间
  • threadFactory:线程工厂,用于创建线程。
  • handler:用来处理任务过多或者其他的原因导致线程池无法处理的时候,任务的拒绝策略。

线程池的工作流程

在这里插入图片描述
  Java线程池工作流程:线程被创建的时候,向系统申请一个用于执行线程队列和管理线程的资源,然后调用execute()添加任务会按照下面的流程执行任务

  • 1、如果

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

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

相关文章

软件卸载工具(windows系统)-geek

有时候软件卸载会很麻烦&#xff0c;使用geek会比较方便。但是针对一些特别大的软件&#xff0c;geek也好像会稍微费点劲&#xff08;比如MATLAB2022A&#xff09;,不过针对一般常规软件的卸载&#xff0c;geek就可以有效地完全卸载了&#xff0c;使用方法也很简单&#xff0c;…

W34kn3ss

靶机下载地址 https://www.vulnhub.com/entry/w34kn3ss-1,270/ 靶机配置 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.160 目录扫描 dirsearch -u "http://192.168.229.160" GETshell 80端口 http://192.168.229.160 这个页面表明&#xff0c…

代码随想录_刷题笔记_第二次

链表 — 环形链表 题目链接&#xff1a;142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c…

【Delphi】遍历容器中所有的 TControl 控件

在 Delphi 中&#xff0c;你可以通过递归或者直接遍历 TForm 上的所有控件&#xff08;TControl&#xff09;。TForm 继承自 TWinControl&#xff0c;它有一个 Controls 属性&#xff0c;可以用于访问包含的所有控件。这个属性是一个数组&#xff0c;存储的是当前窗体上所有的控…

monorepo基础搭建教程(从0到1 pnpm+monorepo+vue)

monorepo 前言1、搭建空项目并配置pnpm-workspace.yamlpnpm initpnpm-workspace.yaml 2.配置packages测试文件配置相关内容 3.引入packages内容至公共package.json4.创建测试项目&#xff0c;并引入公共包结语 前言 有个项目要引入一个第三方库&#xff0c;但是第三方库下载下…

C++_类和对象(中篇)—— const成员函数、取地址运算符的重载

目录 三、类和对象&#xff08;中&#xff09; 6、取地址运算符重载 1、const成员函数 2、取地址运算符的重载 三、类和对象&#xff08;中&#xff09; 6、取地址运算符重载 1、const成员函数 将const修饰的成员函数称之为const成员函数&#xff0c;const修饰成员函数…

【网络安全的神秘世界】目录遍历漏洞

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 先来了解两个概念&#xff1a; 身份认证&#xff1a;验证用户或者系统身份的过程&#xff0c;确保他们所声明的身份是真实的…

UE 禁用运行模式下的引擎内置按键

找到对应引擎版本安装目录下的BaseInput.ini文件&#xff0c;打开并修改

YoloV8改进策略:BackBone改进|Swin Transformer赋能YoloV8,性能跃升的新篇章

摘要 在深度学习领域,目标检测作为计算机视觉的核心任务之一,其性能的提升始终吸引着研究者们的目光。近期,我们创新性地将Swin Transformer这一前沿的Transformer架构引入到YoloV8目标检测模型中,通过替换其原有的主干网络,实现了检测性能的显著提升,为YoloV8系列模型注…

.Net网络通信组件 - TouchSocket

文章目录 .Net网络通信组件 - TouchSocket1、新建.Net8控制台项目2、Nuget安装TouchSocket组件3、编写服务端代码4、编写客户端代码5、编写Program代码6、运行效果7、日志组件&#xff08;NLog&#xff09;参考我的另一篇博客 .Net网络通信组件 - TouchSocket 1、新建.Net8控制…

网络安全学习路线,史上最全网络安全学习路线整理

很多小伙伴在网上搜索网络安全时&#xff0c;会出来网络安全工程师这样一个职位&#xff0c;它的范围很广&#xff0c;只要是与网络安全挂钩的技术人员都算网络安全工程师&#xff0c;一些小伙伴就有疑问了&#xff0c;网络安全现在真的很火吗&#xff1f; 那么无涯就带大家看…

《高等代数》范德蒙德行列式(应用)

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;此题中的行列式是缺失了一行的范德蒙德行列式&#xff0c;解题思路是将其与范德蒙德行列式进行对比&#xff0c;我们将其添上一行和一列补成范德蒙德行列…

解决SPI1在发送和接收8位数据时出现接收不同步的问题

STM32G474的SPI1工作在主机模式&#xff0c;将SPI1_MISO和SPI1_MOSI连接一起&#xff0c;实现自发自收测试。但是在“使用8位数据自发自收时”时&#xff0c;发现接收数据不是同步的。虽然SPI1初始化正确&#xff0c;但是还需要对SPI1_DR寄存器进行强制转换&#xff0c;否则&am…

2024年网络安全人才发展报告一览

前不久&#xff0c;由信通院、工业和信息化部教育与考试中心、中国网络空间新兴技术安全创新论坛等单位联合发布了《2024网络安全产业人才发展报告》&#xff0c;长达87页的调研报告深度剖析了目前中国网络安全产业人才供需、分布、就业等现状&#xff0c;这里&#xff0c;星尘…

C++ 第三讲:内存管理

C 第三讲&#xff1a;内存管理 1.C内存分布2.内存管理方式2.1C语言内存管理方式2.2C内存管理方式2.2.1new\delete操作内置类型2.2.2new\delete操作自定义类型 3.operator new与operator delete函数4.new和delete实现原理4.1内置类型4.2自定义类型 5.定位new5.1内存池的基本了解…

基于Java的学生档案管理系统的设计与实现

基于springbootvue实现的学生档案管理系统 &#xff08;源码L文ppt&#xff09;4-065 第4章 系统设计 4.1 总体功能设计 学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面&#xff0c;支…

【网络】传输层协议TCP

TCP协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793定义。TCP在IP&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;网络层上提供…

【Linux】—— muduo网络库的安装配置与使用

muduo网络库编程 Linux环境下Epollpthread线程库 Boost库安装与使用 安装Boost库 下载boost库源码&#xff0c;linux环境解压 tar -zxvf boost_1_69_0.tar.gz 解压完成后&#xff0c;进入该目录&#xff0c;查看内容 运行bootstrap.sh工程编译构建程序 ./bootstrap.sh …

javascript-代码执行原理

js 是解释型语言 js 引擎执行流程 分为两个阶段: 语法分析执行阶段执行阶段涉及的数据结构: 调用栈。处理执行上下文和执行代码内存堆。给对象分配内存任务队列。暂存待执行的任务,分为宏任务队列和微任务队列语法分析 词法分析 > 语法分析 > 代码生成(字节码) …