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

news/2024/12/22 19:33:07/
  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.ppmy.cn/news/1463635.html

相关文章

POSEIDON: Privacy-Preserving Federated NeuralNetwork Learning

写在最前面,感觉这一篇的技术更贴近于密码学,所以部分核心技术读起来比较吃力。仅供大家参考哇~ Abstract—In this paper, we address the problem of privacypreserving training and evaluation of neural networks in an N-party, federated learni…

css用什么单位适应屏幕最合适

在CSS中,要适应屏幕大小,最常用的单位是相对单位,特别是与视窗(viewport)相关的单位,如vw(视窗宽度的百分比)、vh(视窗高度的百分比)、vmin(视窗宽…

【数据结构】链式二叉树(超详细)

文章目录 前言二叉树的链式结构二叉树的遍历方式二叉树的深度优先遍历前序遍历(先根遍历)中序遍历(中根遍历)后序遍历(后根遍历) 二叉树的广度优先遍历层序遍历 二叉树链式结构接口实现二叉树结点个数二叉树叶子结点个数二叉树的深度(高度)二叉树第k层结…

【Redis】 关于 Redis 集合类型

文章目录 🍃前言🌳普通命令🚩sadd🚩smembers🚩sismember🚩scard🚩spop🚩smove🚩srem 🌲集合间操作🚩sinter🚩sinterstore&#x1f6a9…

ECMAScript 深度解析:现代 JavaScript 综合指南

JavaScript,作为无所不在的 Web 语言,其背后的标准规范称为 ECMAScript。无论您是经验丰富的 Web 开发人员还是刚开始编程之旅的新手,理解 ECMAScript 都是释放 JavaScript 全部潜能并构建动态交互式应用程序的关键。在本文中,我们…

RabbitMQ不完整的笔记

同步的不足 1、拓展性差,当要添加功能时,需要在原来的功能代码上做修改,高耦合。 2、性能下降,调用者需要等待服务提供者执行完返回结果后,才能继续向下执行 3、级联失败,由于我们是基于OpenFeign调用交易…

C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

掌握SQL注入检测:深入理解SQLMAP工具

引言 在网络安全领域,SQL注入是一个广泛存在的漏洞,它允许攻击者通过Web应用对数据库执行非法的SQL命令。SQLMAP是检测这类漏洞的顶尖工具之一。本文将深入探讨SQLMAP工具,从其基本介绍到高级使用技巧,帮助读者全面理解并有效运用…