【面试题】那你再说说线程池的核心配置参数都是干什么的?平时我们应该怎么用?
ThreadPoolExecutor(int corePoolSize, // 1int maximumPoolSize, // 2long keepAliveTime, // 3TimeUnit unit, // 4BlockingQueue<Runnable> workQueue, // 5ThreadFactory threadFactory, // 6RejectedExecutionHandler handler )
【corePoolSize】核心线程数,没达到核心线程数时,会创建新的线程。当达到核心线程数时,任务会进去队列
【maximumPoolSize】最大线程数,可以为Integer.MAX_VALUE 21亿。当达到核心线程数时,会去创建额外的线程来执行任务,最多不超过最大线程数
【keepAliveTime】存活时间,当任务处理完成,额外的线程存活一段时间后,会自行销毁。空闲等待时间(该参数默认对核心线程无效,当allowCoreThreadTimeOut手动设置为true时,核心线程超过存活时间后才会被销毁)
【TimeUnit】空闲等待时间的单位
【queue】利用什么队列来存放任务,有界队列、无界队列等。BlockingQueue为无界队列
【ThreadFactory】线程创建工厂
【RejectExecutionHandler】拒绝策略
假设把queue做成有界队列,如下new ArrayBlockingQueue<Runnable>(200),那么假设corePoolSize个线程都在繁忙的工作,大量的任务进入有界队列,队伍也满了,此时怎么办?
如果maximumPoolSize最大线程数比corePoolSize核心线程数大,会额外创建新的线程放入线程池中,用于处理队列中的任务。这些额外的线程处理完一个任务后,会尝试从队列中获取新的任务继续执行
如果额外的线程用完了,而且也在繁忙中,队列也是满的。这个时候还有新任务怎么办?
通过拒绝策略将任务拒绝掉,有几种拒绝策略,可以传入RejectExecutionHandler
(1)AbortPolicy
(2)DiscardPolicy
(3)DiscardOldestPolicy
(4)CallRunsPolicy
(5)自定义拒绝策略
一般比较常用的是fixedThreadPool。可根据上述原理去定制自己的线程池,考虑到核心线程数、队列类型、最大线程数、拒绝策略以及线程释放时间。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); }
corePoolSize与maximumPoolSize相等,即其线程全为核心线程,是一个固定大小的线程池,是其优势;
keepAliveTime = 0 该参数默认对核心线程无效,而FixedThreadPool全部为核心线程;
workQueue 为LinkedBlockingQueue(无界阻塞队列),队列最大值Integer.MAX_VALUE。如果任务提交速度持续大余任务处理速度,会造成队列大量阻塞。因为队列很大,很有可能在拒绝策略前,内存溢出。是其劣势;
FixedThreadPool的任务执行是无序的;
引用:线程池之ThreadPoolExecutor使用
【评论区】
1、在实际的使用中,应该如何合理配置核心线程数和队列长度呢?
线程池数量取决于业务逻辑,计算密集型还是io密集型,队列长度取决于队列中每个对象的大小,32位的系统和64位的采取指针压缩的系统的每个对象的大小也是不一样的,然后根据你jvm的启动参数,推算得出
2、如果corePoolSize大于maximunPoolSize,最多创建的线程数以哪个为准?
抛异常,throw new IllegalArgumentException();
3、线程池能创建多个吗,我们生产中有许多任务是单独创建线程池?
完全可以 ,ThreadPoolExecutor 是 new 出来的,不是单例的
4、如果线程池使用newFixedThreadPool创建,如果阻塞队列使用的是无界队列的话,那么永远不会新建额外线程处理任务,那么额外线程岂不是没用了? 为何要有这种设计呢? 而且这种方式容易导致任务堆积,造成OOM,岂不是很危险,那么为什么不直接使用有界队列和指定数量的最大线程数这种方式,一次解决这些隐患呢?
这个要考虑具体的使用场景,有写场景下不允许拒绝丢弃任务,这时候就只能等线程池的线程慢慢的去消化队列里面的任务。如果场景允许丢弃任务那丢弃完全没问题
corePoolsize和maxmunPoolSize的意思,核心池的数量如果等于最大线程池那就是只用核心池了,最大线程池的数量包括核心池的数量呢,在ThreadPoolExecutor类的构造方法中,如果maximumPoolSize < corePoolSize的话,会抛出IllegalArgumentException异常,工厂类的线程池方法,maxmunPoolSize如果是Integer.MAX_VALUE的话,核心池的数量一般是0,来一个任务创建一个线程,IO密集型的任务才会用到这个,至于具体的创建线程池,建议最好采用构造方法手动创建,并指定有界队列
【面试题】那你再说说线程池的核心配置参数都是干什么的?平时我们应该怎么用?相关推荐
- java线程池面试题有哪些?java线程池常见面试题
进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...
- 腾讯面试题Java 并发包之线程池综述
Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- Java线程池框架核心代码分析
前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...
- Java 线程池框架核心代码分析
转载自 Java 线程池框架核心代码分析 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executo ...
- hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...
核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...
- 线程池的核心线程会销毁吗?
今天跟别人讨论了线程池的核心线程会不会销毁的问题 先上代码 public static void main(String[] args) throws InterruptedException {Th ...
- 线程池基本了解及其参数配置
前言 在面试的过程中,总会说:谈谈你对线程池的理解. 什么是线程池? 线程池有什么优势? 如何创建线程池? 线程池的参数配置是什么? 常用线程分类有什么? 为此,做一个总结.巩固我那薄弱的知识. 什么 ...
- 【多线程】线程池的创建和参数设定
为什么要使用线程池 在日常开发中为了提高代码运行效率,或多或少会用线程去执行异步任务,线程的创建和销毁是需要占用一定资源的. 首先我们看一下一个线程的创建步骤: 为线程堆栈分配和初始化大量内存块 需要 ...
最新文章
- 坑系列 --- 时间和空间的平衡
- 《Dojo构建Ajax应用程序》随书源码
- ubuntu vscode上使用cmake、编译、调试
- UIAlertView' is deprecated: first deprecated in iOS 9.0 - UIAlertView is deprecated. Use UIAlert
- android笔记3:activity的生命周期(转)
- 写给前端工程师的 Flutter 详细教程
- 手把手教你学Dapr - 1. .Net开发者的大时代
- java 精选选择题_Java生产率提示:社区精选
- mysql 中文乱码解决方法
- 【华为云实战开发】1.传统Java项目怎么能变得高大上?
- String.resize()
- StyTr^2:Image Style Transfer with Transformers
- 几何画板椭圆九种画法_最全的几何画板绘制椭圆教程
- Centos安装Docker的详细安装步骤
- 【登录界面】vue、element-ui登录界面模板
- [kubernetes]-kubernetes+nfs创建高可用mysql
- 计算机丢失cxcore100.dll,cxcore100.dll
- day56 JavaScript
- 项目需求讨论-标题栏上的搜索功能
- CRM客户关系管理系统主要有哪些功能?
热门文章
- java面试宝典(综合知识)
- Arduino uno控制蜂鸣器播放音乐(以《大鱼》为例)
- 智能投顾奇葩发展术:越靠“爹”,越有机会
- Word | 日文文段注音方法 Win Mac
- R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图
- [转]我在赶集网的两个月 7.4(完结)
- 能一次性管理10--20个群的微信群机器人助手到底有多好用!
- 计算机窗口置顶,将想要的窗口一直置顶的具体操作步骤介绍
- 数字中国建设2522整体框架
- 谢谢这世间,所有不动声色的善良