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密集型的任务才会用到这个,至于具体的创建线程池,建议最好采用构造方法手动创建,并指定有界队列

【面试题】那你再说说线程池的核心配置参数都是干什么的?平时我们应该怎么用?相关推荐

  1. java线程池面试题有哪些?java线程池常见面试题

    进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...

  2. 腾讯面试题Java 并发包之线程池综述

    Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...

  3. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  4. Java线程池框架核心代码分析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...

  5. Java 线程池框架核心代码分析

    转载自 Java 线程池框架核心代码分析 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executo ...

  6. hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...

    核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...

  7. 线程池的核心线程会销毁吗?

    今天跟别人讨论了线程池的核心线程会不会销毁的问题 先上代码 public static void main(String[] args) throws InterruptedException {Th ...

  8. 线程池基本了解及其参数配置

    前言 在面试的过程中,总会说:谈谈你对线程池的理解. 什么是线程池? 线程池有什么优势? 如何创建线程池? 线程池的参数配置是什么? 常用线程分类有什么? 为此,做一个总结.巩固我那薄弱的知识. 什么 ...

  9. 【多线程】线程池的创建和参数设定

    为什么要使用线程池 在日常开发中为了提高代码运行效率,或多或少会用线程去执行异步任务,线程的创建和销毁是需要占用一定资源的. 首先我们看一下一个线程的创建步骤: 为线程堆栈分配和初始化大量内存块 需要 ...

最新文章

  1. 坑系列 --- 时间和空间的平衡
  2. 《Dojo构建Ajax应用程序》随书源码
  3. ubuntu vscode上使用cmake、编译、调试
  4. UIAlertView' is deprecated: first deprecated in iOS 9.0 - UIAlertView is deprecated. Use UIAlert
  5. android笔记3:activity的生命周期(转)
  6. 写给前端工程师的 Flutter 详细教程
  7. 手把手教你学Dapr - 1. .Net开发者的大时代
  8. java 精选选择题_Java生产率提示:社区精选
  9. mysql 中文乱码解决方法
  10. 【华为云实战开发】1.传统Java项目怎么能变得高大上?
  11. String.resize()
  12. StyTr^2:Image Style Transfer with Transformers
  13. 几何画板椭圆九种画法_最全的几何画板绘制椭圆教程
  14. Centos安装Docker的详细安装步骤
  15. 【登录界面】vue、element-ui登录界面模板
  16. [kubernetes]-kubernetes+nfs创建高可用mysql
  17. 计算机丢失cxcore100.dll,cxcore100.dll
  18. day56 JavaScript
  19. 项目需求讨论-标题栏上的搜索功能
  20. CRM客户关系管理系统主要有哪些功能?

热门文章

  1. java面试宝典(综合知识)
  2. Arduino uno控制蜂鸣器播放音乐(以《大鱼》为例)
  3. 智能投顾奇葩发展术:越靠“爹”,越有机会
  4. Word | 日文文段注音方法 Win Mac
  5. R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图
  6. [转]我在赶集网的两个月 7.4(完结)
  7. 能一次性管理10--20个群的微信群机器人助手到底有多好用!
  8. 计算机窗口置顶,将想要的窗口一直置顶的具体操作步骤介绍
  9. 数字中国建设2522整体框架
  10. 谢谢这世间,所有不动声色的善良