Java线程池和Executor框架-面试与分析

news2024/9/21 14:45:11

线程池

什么是线程池?为什么要用线程池?

在Java并发框架中,线程池时使用最多的东西,几乎所有需要异步并发执行任务的程序都可以使用线程池。
使用线程池带来的好处:

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的损耗
  • 提高响应时间。当任务到达时,任务可以不需要等待线程创建就可以立即执行
  • 提高线程的可管理性。线程是稀缺资源,如果无限创建,会降低系统的稳定性,使用线程可以进行统一分配,调优和监控。

核心参数有哪些?

源代码
7个参数:
corePoolSize:核心线程池的大小
maximumPoolSize:线程池能创建线程的最大数
keepAliveTime:空闲线程存货时间
unit:时间单位,为keepAliveTIme指定时间单位
workQueue:阻塞队列,用于保存任务的阻塞队列
threadFactory:创建线程的工程类
handler:饱和策略**(拒绝策略)**

常用线程池的区别及特点?

  1. newCachedThreadPool(无限池)
  • 特点:newCachedThreadPool创建了一个可缓存线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活的回收空闲的线程,当需要增加时,它可以灵活的添加新的线程,而不会对池的长度做任何限制
  1. newFixedThreadPool(固定)
  • 特点:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列 中等待。定长线程池的大小需要根据系统 资源进行设置
  • 缺点:线程数量是固定的,但是阻塞队列是无界队列。如果有很多请求积压,阻塞队列越来越长,容易导致OOM(超出内存空间)
  1. newScheduledThreadPool
  • 特点:创建一个固定长度线程池,而且支持定时的以及周期性的任务执行,类似于Timer
  • 缺点:同样是使用无界队列。如果有很多请求积压,阻塞队列越来越长,容易导致OOM
  1. newSingleThreadExecutor
  • 特点:创建一个单线程话的线程池,它只会用唯一的工作线程来执行任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代他,必须保证所有任务按照指定顺序(FIFO)执行。
  • 缺点:很明显,他是单线程的,高并发业务下不行

在Java中Executor和Executors的区别?

Executors工具类的不同方法按照我们的需求创建不同的线程池,来满足业务的需求。
Executor接口对象能执行我们的线程任务
ExecutorService接口继承了Executor接口并进行了扩展,提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值。

线程池都有哪些状态?

在这里插入图片描述
RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。
SHUTDOWN:不接受新的任务提交,但是会继续等待队列中的任务
STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程
TIDYING:所有的任务都销毁了,workerCount为0,线程池的状态正在转换为TIDYING状态时,会执行钩子方法terminated()。
TERMINATED:上述的terminated()方法结束之后,线程池的状态就会变成这个。

线程池中submit()和execute()方法有什么区别?

  • 相同点:都可以开启线程执行池中的任务
  • 不同点:
    • 接受参数 :execute()只能执行Runnable类型的任务。submit()可以执行Runnable和Callable类型的任务。
    • 返回值:submit()方法可以返回持有计算结果的Future对象,而execute()没有。
    • 异常处理:submit()方便Exception处理

ThreadExecutor饱和策略有哪些?

如果当前同时运行的线程数量达到最大线程数量并且队列也已经放满了,ThreadPoolTaskExecutor定义了一些策略:

  • ThreadPoolTaskExecutor.AbortPolicy:抛出 RejectExecutionException来拒绝新任务的处理。
  • ThreadPoolTaskExecutor.CallerRunsPolicy:调用提交任务的线程运行任务(A线程提交任务,A负责运行)。但是这种策略会降低新任务的提交速度,影响程序的整体性能。如果你的应用程序可以承受此延迟并且你不能丢弃任何一个任务请求的话,你可以选择这个策略。
  • ThreadPoolExecutor.DiscardPolicy:不处理新任务,直接丢弃掉。
  • ThreadPoolExecutor.DiscardOldestPolicy:将丢弃最早的未处理的任务请求。

线程池的执行原理?

在这里插入图片描述
提交一个任务到线程池中,线程池的处理流程如下:

  1. 判断线程池里的核心线程数是否已满,如果不是(核心线程空闲或者还有核心线程没有被创建),则创建一个新的工作线程来执行任务。如果核心线程已满,则进入下个进程。
  2. 线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
  3. 判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作流程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

如何合理分配线程池大小?

要合理的分配线程池的大小需要根据实际情况来定,简单来说就是根据CPU密集和IO密集来分配。

  1. CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务
  2. IO密集型时,大部分线程都阻塞,故需多配置线程数,2*cpu核数
    总结:
  • 线程等待时间比CPU执行时间比例越高,需要越多线程。
  • 线程CPU执行时间比等待时间比例越高,需要越少线程。
    当然,实际应用中没有固定的公式,需要结合测试和监控来进行调整。

线程池如何实现动态修改?

  1. 首先线程池提供了部分setter方法可以设置线程池的参数;
    a. 修改核心线程数,最大线程数,空闲线程停留空间,拒绝策略等。
    b.可以及那个线程池的配置参数放入配置中心,当需要调整的时候,去配置中心修改就行。

  2. 什么时候修改呢?
    a. 这里需要监控报警策略,获取线程池状态指标,当指标判定为异常之后进行报警
    b.分析指标异常原因,评估处理策略,最后通过上述线程提供的接口进行动态修改

使用无界队列的线程池会导致什么问题?

如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升,最终导致OOM

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

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

相关文章

基于Java语言的充电桩系统+充电管理平台+云快充协议+云快充协议1.5+桩直连协议+云快充协议源码

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议,版本为云快充1.5,对于没有对接过充电桩系统的开发者尤为合适; 2、包含:启…

文心一言功能新升级:读文档、懂翻译、能识图

9月4日,百度文心一言官网显示,在向全社会开放一周年之际,文心一言进行了功能最新全面升级,同时在周年期间为新老会员增加1个月专业版免费使用体验。 据了解,针对网页版用户需求,文心一言实现了创作内容更加…

Linux-进程管理【重点】

前言 Linux操作系统在虚拟机VM上的安装【CentOS版本】-CSDN博客 Linux-(系统启动、用户管理)-CSDN博客 Linux-实用指令-CSDN博客 Linux-【组管理、权限管理、定时任务调度】-CSDN博客 进程管理 在linux中,每个执行的程序都成为一个进程,每一个进程都…

玩转Python Turtle库,实现满屏飘字的魔法!

前言 本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Py…

在OpenEuler(欧拉)系统上用kubeadm部署(k8s)Kubernetes集群

一、OpenEuler(欧拉) 系统简介 openEuler 是开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目; openEuler作为一个操作系统发行版平台,每两年推出一个LTS版本。该版本为企业级用户提供一个安全稳定可靠的操作系统。…

python进阶篇-day07-高级语法与正则

day07-python其他高级语法 一. with(上下文管理) 介绍 概述 一个类只要实现了__ enter __ () 和 __ exit __ ()方法, 这个类就是一个上下文管理器类, 该类的对象 上下文管理器对象 目的 节约资源, 提高效率, 避免手动释放资源, 且出bug的时候, 也会自动尝试释放资源 特点…

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity(实体) Entity 是表示数据库表的对象,通常对应数据库中的一行数据。它通常包含与数据库表对应的字段,并可能包含一些业务逻辑。 DTO(数据传输对象) 作用:DTO 是用于在…

将你的github仓库设置为web代理

将你的github仓库设置为web代理 废话不多说,直接上步骤 废话不多说,直接上步骤 创建一个仓库,上传静态web。 2. 设置仓库的 page 1)点击 “Settings” 如图设置

echarts 实现签到记录日历组件

以下笔记来源:编程导航 分析 有三种基本图表可以选择: 基础日历图:https://echarts.apache.org/examples/zh/editor.html?ccalendar-simple日历热力图:https://echarts.apache.org/examples/zh/editor.html?ccalendar-heatmap…

centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty

需要接入http3,索性最新的nginx在构建一波,趟一遍坑 准备工作 1.环境命令安装 yum install GeoIP -y yum install GeoIP-devel -y yum install libmaxminddb-devel -y yum install -y patch wget zlib zlib-devel lftp gcc gcc-c make openssl-devel p…

YOLOv5: 从0开始搭建环境进行模型训练

视频链接:YOLOv5: 从0开始搭建环境进行模型训练_哔哩哔哩_bilibili 《YOLOv5:从0开始搭建环境进行模型训练》课程致力于帮助学生实战YOLOv5目标检测算法。常心老师将手把手带领大家从0开始搭建YOLOv5环境,带领大家排坑、避坑、填…

windows 环境下搭建mysql cluster 集群详细步骤

1、环境准备 下载mysql集群版本,我这里下载的是mysql-cluster-8.0.39-winx64 https://dev.mysql.com/downloads/cluster/ 2、创建配置文件 mysql集群版本下载以后解压后目录如下,创建配置文件 config.ini(集群配置文件,my.ini mysql配置…

人工智能、机器学习与深度学习的区别及其应用

引言 在过去的十年中,人工智能(AI)从研究实验室走向了工业应用的前沿,成为推动各个行业转型的关键技术。然而,AI 并不仅仅是某一种单一的技术,它包含了多种不同的方法和工具,适用于解决从自动驾驶到医疗诊断等复杂问题。与此同时,行业内对“人工智能”、“机器学习”与…

数据库锁之行级锁、记录锁、间隙锁和临键锁

1. 行级锁 InnoDB 引擎支持行级锁,而MyISAM 引擎不支持行级锁,只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句,是不会加记录锁的,因为它属于快照读,通过在MVCC中的undo log版本链实现。如果要在查询时对…

如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧

如何从硬盘恢复已删除/丢失的文件?本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据,或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗?当我将外部硬盘插入计算机时,我错误地删除了一些文…

自动提取上升沿周期时间python

import pandas as pd import numpy as np# 读取你的CSV数据(假设数据已经加载到 DataFrame df 中) # df pd.read_csv(your_data.csv)# 确保保存时间是datetime类型 df[保存时间] pd.to_datetime(df[保存时间])# 假设喂料电机实时转速的列名为 喂料电机…

828华为云征文|基于Flexus云服务器X实例的应用场景-拥有一款自己的ssl监控工具

先看这里 写在前面效果图华为云Flexus云服务器X实例介绍特点可选配置购买 连接服务器Uptime-kuma简介开源信息部署准备工作:docker部署命令访问uptime-kuma 基本配置总结 写在前面 作为一个个人开发者,相信你手里肯定也有不少自己的服务,有的…

【Linux修行路】线程安全和死锁

目录 ⛳️推荐 一、线程安全 1.1 常见的线程不安全情况 1.2 常见的线程安全情况 1.3 常见的不可重入情况 1.4 常见可重入的情况 1.5 可重入与线程安全的联系 1.6 可重入与线程安全的区别 二、死锁 2.1 死锁的四个必要条件 2.2 如何避免产生死锁? ⛳️推荐…

Mysql高级教程

1.安装部署 安装依赖性: [rootmysql-node10 ~]# dnf install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el7_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 [rootmysql-node10 ~]# tar zxf mysql-boost-5.7.44.tar.gz [rootmysql-no…

SpringSecurity原理解析(一)

一、SpringSecurity 核心组件 在SpringSecurity中的jar包有4个,作用分别为: spring-security-coreSpringSecurity的核心jar包,认证和授权的核心代码都在这里面spring-security-config如果使用Spring Security XML名称空间进行配置或Spring S…