Java后端面试题(线程池相关)(day11)

2024-08-29 09:44

本文主要是介绍Java后端面试题(线程池相关)(day11),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • JDK内置线程池有哪几种?
    • FixedThreadPool
    • SingleThreadExecutor
    • CachedThreadPool
    • ScheduledThreadPool
  • 线程池常见参数有哪些?如何解释?
  • 为什么不推荐使用内置线程池?
  • 线程池的拒绝策略有哪些?

JDK内置线程池有哪几种?


FixedThreadPool

  • 创建一个固定大小的线程池。
  • 线程池中的线程数量是固定的,当一个任务完成后,这个线程会被用来执行另一个任务。
  • 如果提交的任务数量超过了线程的数量,那么超出的任务会被放在队列中等待。

SingleThreadExecutor

  • 创建一个单线程化的线程池。
  • 只有一个工作线程,确保所有任务按照指定顺序(FIFO,先进先出)执行。
  • 通常用于需要保证顺序执行的任务,例如更新GUI等。

CachedThreadPool

  • 创建一个可缓存的线程池。
  • 这种线程池能够自动调整线程数量,如果一段时间内没有新的任务提交,多余的空闲线程就会被终止。
  • 适合处理大量短时间的任务。

ScheduledThreadPool

  • 创建一个支持定时及周期性任务执行的线程池。
  • 支持在给定延迟后运行命令或者定期执行。
  • 可以用它来安排在将来某个时刻或定期执行的任务。

线程池常见参数有哪些?如何解释?


ThreadPoolExecutor 3 个最重要的参数:

  • corePoolSize : 核心线程数。这是线程池中始终维持的最小线程数。即使线程空闲,核心线程也不会被销毁。只有当线程池被关闭时,才会终止核心线程。
  • maximumPoolSize : 最大线程数。线程池允许创建的最大线程数。当任务队列满且等待的任务数量超过了队列容量时,线程池会创建新的线程来处理额外的任务,直到达到最大线程数。
  • workQueue任务队列。当提交的任务数量超过 corePoolSize 时,新提交的任务会被放置在这个队列中等待执行。

ThreadPoolExecutor其他常见参数 :

  • keepAliveTime:空闲线程的存活时间。
  • unit : keepAliveTime 参数的时间单位。
  • threadFactory :线程工厂。用于创建新线程,可以用来设置线程名称、优先级等。
  • handler :拒绝策略。

为什么不推荐使用内置线程池?


Executors 返回线程池对象的弊端如下:

  • FixedThreadPoolSingleThreadExecutor:使用的是有界阻塞队列是 LinkedBlockingQueue ,其任务队列的最大长度为 Integer.MAX_VALUE ,可能堆积大量的请求,从而导致 OOM(内存溢出)。
  • CachedThreadPool:使用的是同步队列 SynchronousQueue, 允许创建的线程数量为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM(内存溢出)。
  • ScheduledThreadPoolSingleThreadScheduledExecutor :使用的无界的延迟阻塞队列 DelayedWorkQueue ,任务队列的最大长度为 Integer.MAX_VALUE ,可能堆积大量的请求,从而导致 OOM(内存溢出)。

线程池的拒绝策略有哪些?

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

  • AbortPolicy抛出 RejectedExecutionException异常来拒绝新任务的处理。
  • CallerRunsPolicy调用执行自己的线程运行任务,也就是直接在调用execute方法的线程中运行(run)被拒绝的任务,如果执行程序已关闭,则会丢弃该任务。
  • DiscardPolicy不处理新任务,直接丢弃掉。
  • DiscardOldestPolicy:此策略将丢弃最早的未处理的任务请求。

这篇关于Java后端面试题(线程池相关)(day11)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117504

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis