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

线程池

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

在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.rhkb.cn/news/418684.html

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

相关文章

ffmpeg安装测试(支持cuda支持SRT)

文章目录 背景安装ffmpeg直接下载可执行文件选择版本选择对应系统版本下载测试Linux下安装 查看支持协议以及编码格式 常见错误缺少 libmvec.so.1LD_LIBRARY_PATH 错误 GPU加速测试SRT服务器搭建下载srs5.0源码解压安装配置启动 SRT推流测试SRT播放测试 背景 在音视频开发测试中…

【扇贝编程】使用Selenium模拟浏览器获取动态内容笔记

文章目录 selenium安装 selenium下载浏览器驱动 获取数据处理数据查找一个元素查找所有符合条件的元素 控制浏览器 selenium selenium是爬虫的好帮手, 可以控制你的浏览器,模仿人浏览网页,从而获取数据,自动操作等。 我们只要让…

LLM 模型压缩之三: FoldGPT

0. 资源链接 论文: FoldGPT: Simple and Effective Large Language Model Compression Scheme 项目: to be released. 1. 背景动机 现有的大语言模型推理存在以下问题: LLM 模型因为有大量的参数,以及 next token 的预测方式,导致 LLM 模…

关于CPP——std::future异步操作

目录 一、std::future 简介 1.1 概念 1.2 应用场景 1.3 关联的方法 1.3.1 std::async 1.3.2 std::package 1.3.3 std::promise 二、future 用法 2.1 使用std::async关联异步任务 2.2 使用std::packaged_task 1. 获取任务结果的机制: 2. 异步任务的管理&a…

Qt/C++开源项目 TCP客户端调试助手(源码分享+发布链接下载)

这是一个TCP客户端调试助手,具有简洁直观的界面,用户能够方便地测试TCP协议的通信功能,并可同时作为客户端与服务器端使用。以下是该程序的功能特点及用途介绍: 功能特点: TCP客户端与服务器调试:支持同时…

【word导出带图片】使用docxtemplater导出word,通知书形式的word

一、demo-导出的的 二、代码操作 1、页面呈现 项目要求,所以页面和导出来的word模版一致 2、js代码【直接展示点击导出的js代码】 使用插件【先下载这五个插件,然后页面引入插件】 import docxtemplater from docxtemplater import PizZip from pizzip …

LTE PSS主同步信号搜索 MATLAB实现

本期带来PSS相关检测说明和MATLAB实现,本期只讲相关方面的,所以MATLAB实现也是相关的部分,频偏估计方面的待下期开讲。 LTE 4G PSS搜索分为TDD搜索和FDD搜索,但是对于 TDD 和 FDD 而言,PSS同步信号的结构是完全一样的&…

sheng的学习笔记-AI-半监督聚类

AI目录:sheng的学习笔记-AI目录-CSDN博客 半监督学习:sheng的学习笔记-AI-半监督学习-CSDN博客 聚类:sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 均值算法:sheng的学习笔记-AI-K均值算法_k均值算法怎么算迭代两次后的最大…

图形验证码从设计到实现

验证码的使用场景 图形验证码在我们的日常使用中是非常常见的,比如一些App、小程序、PC网站等。涉及到的业务也比较广泛、例如用户登录流程、注册流程、找回密码。下面我们来大致梳理下上述流程: 登录流程 用户首先在登录界面输入手机号然后通过图形验…

VMware时提示系统尚未修改安装失败

安装VMware安装失败,提示系统尚未修改 有以下解决方案: 1.操作系统不兼容 2.安装文件损坏 3.安装程序错误 4.硬件问题 解决:由于重装系统前,安装过VAware,所以应该操作系统,硬件没有问题。下载一个软件v…

关于Redis集群同步/持久化/淘汰机制的详解

Redis是非常常用的KV数据库, 使用内存以及HashMap进行存储的特点带来了高效的查询. 本文将围绕Redis的常见开发使用场景, 阐述在Redis集群中各个节点是如何进行数据同步, 每个节点如何进行持久化以及在长期使用中如何对数据进行更新和淘汰. 如果对Redis有更多的兴趣, 可以查看我…

Java中方法的使用详解

1.引言 假设有一个美女博主,每次发的照片都特别漂亮 然后该博主的评论区每次都会有很多粉丝的评论: 哇!宝宝好漂亮,求上衣链接!!! 老婆亲亲!这个口红是什么色号呀? 宝…

【go】内存分配模型

内存是怎么分配给对象的? 内存分配优化的地方是? 讲讲golang内存分配模型? ans: 1.按照对象的大小分配:先算出对象的大小如果是tiny对象,就从tiny block中获取地址和偏移量,将对象打包到mcache;如果是16B以…

Python 在Excel中应用和取消多种不同类型的数据筛选

目录 安装Python Excel处理库 Python 在 Excel 中应用文本筛选 Python 在 Excel 中应用数字筛选 Python 在 Excel 中应用字体颜色、单元格颜色或图标集筛选 Python 在 Excel 中应用日期筛选 Python 在 Excel 中应用动态日期筛选 Python 在 Excel 中筛选空单元格或非空单…

【ArcGIS Pro第一期】界面简介

ArcGIS Pro简介 ArcGIS Pro界面简介1.1 打开工程1.2 使用功能区上的工具 参考 ArcGIS Pro 是一种基于功能区的应用程序。 ArcGIS Pro 窗口顶部的功能区有许多命令可供选择,而根据需要打开的各个窗格(可停靠窗口)中则提供了更为高级或专用的功…

快速排序(QuickSort)-归并排序(MergeSort)[java编写]

1. 快速排序 1.1 基本概述 快速排序采用分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot 将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用…

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论…

算法训练营——day3长度最小子数组

1 长度最小子数组-力扣209(中等) 1.1 题目: 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返…

基于orangePi的智能家居系统

目录 一.接线图 1.orangePi接线 2.继电器接线 二.语音模块的配置 1.pin脚的配置 2.命令词自定义信息 三.测试 1.通过gpio指令测试烟雾检测器是否正确连接 2.编写脚本测试其他模组接线是否正常 四.人脸识别方案 1.首先开通人脸搜索识别服务 2. 点击产品控制台,向人…

2024年四川省安全员B证证考试题库及四川省安全员B证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年四川省安全员B证证考试题库及四川省安全员B证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…