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

  线程池的出现,主要是用来管理一组线程的工作运行状态,这样可以方便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.xdnf.cn/news/143058.html

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

相关文章

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代&#xff0c;想必大家对其都不陌生。随着科技的发展&#xff0c;常用的路由器上的天线也越来越多&#xff0c;那么问题来了&#xff1a;天线越多&#xff0c;信号越好吗&#xff1f;路由器…

视频转文字工具:开启视频内容深度挖掘的钥匙

图片里到文字要提取出来&#xff0c;现在有很多的工具&#xff0c;但是视频里的文字要提取出来&#xff0c;是不是就不那么好操作呢&#xff1f;并不是的&#xff0c;现在也有不少支持视频转文字的工具&#xff0c;这次我们就来介绍一些可以提高我们视频文字提取效率的工具吧。…

【CSS in Depth 2 精译_033】5.4 Grid 网格布局的显示网格与隐式网格(中)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

[Redis][环境配置]详细讲解

目录 1.安装 && 简单配置2.文件目录说明3.客户端 1.安装 && 简单配置 Ubuntu下&#xff0c;直接使用sudo apt install redis -y即可支持远程连接&#xff1a;修改/etc/redis/redis.conf 将bind 127.0.0.1改为bing 0.0.0.0作为学习用途&#xff0c;可以将prote…

代码——IMX6UL烧录工具及其使用

一、简介 在此感谢正点原子官方提供的IMX6UL烧录代码&#xff0c;本篇是在正点原子给的代码基础上修改的&#xff0c;增加了些许功能&#xff0c;可根据自己的需求更改。此外代码难免有疏漏之处&#xff0c;还望见谅 二、源代码的使用 1,库和工具的安装 安装库和工具前&#x…

Datawhale X 南瓜书 task01学习笔记

机器学习三观 机器学习工程领先理论 what:什么是机器学习? 机器学习定义&#xff1a;研究关于“学习算法”(一类能从数据中学习出其背后潜在规律的算法)的一门学科PS:深度学习指的是&#xff1a;神经网络那一类学习算法&#xff0c;因此是机器学习的子集把深度学习单列出来…

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

Linux下rpm方式部署mysql(国产化生产环境无联网服务器部署实操)

请放心观看&#xff0c;已在正式环境部署验证&#xff0c;流程无问题&#xff01; 所用系统为国产化麒麟银河 aarch64系统&#xff0c;部署时间2024年9月份&#xff01; #查看服务器信息 #涉及生产服务器&#xff0c;所以输出信息隐藏了一部分[rootecs-xxxxx hdata]# uname -…

Java 中常用的排序算法

Java 中常用的排序算法有很多&#xff0c;每种算法的时间复杂度和适用场景都不同。以下是几种常见的排序算法及其 Java 实现和讲解&#xff1a; 1. 冒泡排序 (Bubble Sort) 算法思路&#xff1a; 重复地遍历数组&#xff0c;每次比较相邻两个元素。如果前一个比后一个大&…

性能测试笔记

一、性能测试介绍 1.概述 性能测试时通过工具/代码模拟正常/峰值/异常的负载条件&#xff0c;对系统的各项性能指标进行测试和评估的过程 本阶段的学习范围是服务端的性能测试&#xff0c;不包括客户端性能 测试目的 评估当前系统能力&#xff0c;如&#xff1a;新出的手机都…

新书速览|NestJS全栈开发解析:快速上手与实践

《NestJS全栈开发解析:快速上手与实践》 本书内容 《NestJS全栈开发解析:快速上手与实践》旨在帮助读者快速掌握NestJS&#xff08;简称Nest&#xff09;开发&#xff0c;并应用于实战项目。本书共10章&#xff0c;首先介绍基本概念&#xff0c;为读者打下坚实的知识基础。接着…

chapter15-泛型——(泛型语法)——day20

目录 554-泛型引入 555-泛型入门 556-泛型入门 557-泛型应用实例 558/9-泛型使用细节 560-泛型课堂练习 554-泛型引入 555-泛型入门 556-泛型入门 泛型先泛再型 557-泛型应用实例 泛型一旦指定了&#xff0c;编译器就会按照指定来约束传入类型 558/9-泛型使用细节 560-泛…

算法训练——day15数组交集(是否去重)

349. 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入…

Java SE基础知识详解:源于技术书籍的深度解读

写在前面 ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#xff0c;这不仅增加了学习的难度&#xff0c;还容易导致概念上的混淆。特别是当这些信息来自不同博主的文章或是视…

【C语言零基础入门篇 - 9】:文件操作

文章目录 文件操作文件的简介指向指针的文件文件的打开方式字符的读取和存储数据的读取和存储 文件操作 文件的简介 一、什么是文件&#xff1f; 文件有不同的类型&#xff0c;主要有两种文件&#xff1a; &#xff08;1&#xff09;程序文件。&#xff08;2&#xff09;数据…

python基础(1)pyenv安装和对Django使用

pyenv安装 pyenv主要针对类 Unix 系统&#xff08;如 Linux、macOS&#xff09;用户&#xff0c;pyenv-win 是专为 Windows 开发的 pyenv 版本&#xff0c;允许您在不使用 WSL 的情况下管理多个 Python 版本和虚拟环境。 建议Git Bash&#xff1a; Powershell或Git Bash&…

攻防实战-nacos新洞如何反弹和注入内存马

攻防实战-nacos新洞如何反弹和注入内存马 起因 ‍‍‍‍hw中,遇到2个nacos还在测试nacos的yaml漏洞时候,突然有人发了0day.不过网上的师傅好像都没有继续下一步. 本地搭建了windows和linux先本地测试了一下. 测试 ‍‍总体分为两步,第一步 http://ip/nacos/v1/cs/ops/data/…

基于windows下docker安装HDDM并运行

安装主要教程 如何安装HDDM(基于windows下 docker 和 linux) | 传鹏的实验室 (chuan-peng-lab.netlify.app) 安装时遇到的问题 1.下载完docker安装包&#xff0c;安装提示不适合本电脑 解决办法&#xff1a; 第一步&#xff1a;开启CPU虚拟化 Windows电脑如何开启CPU虚拟化…

【C51】独立按键控制LED灯

1.简介 在单片机应用系统中&#xff0c;常常使用轻触按键组成键盘。轻触按键具有自动回弹的特点&#xff0c;即按下按键&#xff0c;两个触点接通&#xff0c;放开按键&#xff0c;两个触点断开。轻触按键的外形及电路符号如图&#xff0c;通常轻触按键有4个引脚&#xff0c;4个…

Flink系列知识之:Checkpoint原理

Flink系列知识之&#xff1a;Checkpoint原理 在介绍checkpoint的执行流程之前&#xff0c;需要先明白Flink中状态的存储机制&#xff0c;因为状态对于检查点的持续备份至关重要。 State Backends分类 下图显示了Flink中三个内置的状态存储种类。MemoryStateBackend和FsState…