万字总结最全Java线程池ThreadPoolExecutor面试题(三)

简介: 万字总结最全Java线程池ThreadPoolExecutor面试题(三)

1.png

4.2.2 Executors工具类

可以自己实例化线程池,也可用Executors创建线程池的工厂类,

常用方法

ExecutorService 的抽象类AbstractExecutorService提供了submit、invokeAll 等方法的实现,但是核心方法Executor.execute()并没有在这里实现。

因为所有的任务都在该方法执行,不同实现会带来不同的执行策略。


通过Executors的静态工厂方法可以创建三个线程池的包装对象

  • ForkJoinPool
  • ThreadPoolExecutor
  • ScheduledThreadPoolExecutor

● Executors.newWorkStealingPool

JDK8 引入,创建持有足够线程的线程池支持给定的并行度,并通过使用多个队列减少竞争,构造方法中把CPU数量设置为默认的并行度。

返回ForkJoinPool ( JDK7引入)对象,它也是AbstractExecutorService 的子类


image.png

image.png

● Executors.newCachedThreadPool

创建一个无界的缓冲线程池,它的任务队列是一个同步队列。

任务加入到池中

  • 若池中有空闲线程,则用空闲线程执行
  • 若无,则创建新线程执行


池中的线程空闲超过60秒,将被销毁。线程数随任务的多少变化。

适用于执行耗时较小的异步任务。池的核心线程数=0 ,最大线程数= Integer.MAX_ _VALUE

maximumPoolSize 最大可至Integer.MAX_VALUE,是高度可伸缩的线程池。

若达到该上限,没有服务器能够继续工作,直接OOM。

keepAliveTime 默认为60秒;

工作线程处于空闲状态,则回收工作线程;

如果任务数增加,再次创建出新线程处理任务.


● Executors.newScheduledThreadPool

能定时执行任务的线程池。该池的核心线程数由参数指定,线程数最大至Integer.MAX_ VALUE,与上述一样存在OOM风险。

ScheduledExecutorService接口的实现类,支持定时及周期性任务执行;

相比Timer,ScheduledExecutorService 更安全,功能更强大.

与newCachedThreadPool的区别是不回收工作线程.


● Executors.newSingleThreadExecutor

创建一个单线程的线程池,相当于单线程串行执行所有任务,保证按任务的提交顺序依次执行.

只有-个线程来执行无界任务队列的单-线程池。该线程池确保任务按加入的顺序一个一

个依次执行。当唯一的线程因任务 异常中止时,将创建一个新的线程来继续执行 后续的任务。

与newFixedThreadPool(1)的区别在于,单线程池的池大小在newSingleThreadExecutor方法中硬编码,不能再改变的。


● Executors.newFixedThreadPool

创建一个固定大小任务队列容量无界的线程池

输入的参数即是固定线程数;

既是核心线程数也是最大线程数;

不存在空闲线程,所以keepAliveTime等于0.


image.png

其中使用了 LinkedBlockingQueue, 但是没有设置上限!!!,堆积过多任务!!!

下面介绍LinkedBlockingQueue的构造方法

image.png

使用这样的无界队列,若瞬间请求非常大,会有OOM风险。

除newWorkStealingPool 外,其他四个创建方式都存在资源耗尽的风险.


不推荐使用其中的任何创建线程池的方法,因为都没有任何限制,存在性能隐患。

Executors中默认的线程工厂和拒绝策略过于简单,通常对开发者不够友好。

线程工厂需要做创建前的准备工作,对线程池创建的线程必须明确标识,就像药品的生产批号一样,为线程本身指定有意义的名称和相应的序列号.

拒绝策略应该考虑到业务场景,返回相应的提示或者友好地跳转.

以下为简单的ThreadFactory 示例

1.png

上述示例包括线程工厂和任务执行体的定义;

通过newThread方法快速、统一地创建线程任务,强调线程一定要有特定意义的名称,方便出错时回溯.


目录
相关文章
|
23天前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
23天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
181 37
|
23天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
23天前
|
存储 关系型数据库 MySQL
【Java面试题汇总】MySQL数据库篇(2023版)
聚簇索引和非聚簇索引、索引的底层数据结构、B树和B+树、MySQL为什么不用红黑树而用B+树、数据库引擎有哪些、InnoDB的MVCC、乐观锁和悲观锁、ACID、事务隔离级别、MySQL主从同步、MySQL调优
【Java面试题汇总】MySQL数据库篇(2023版)
|
23天前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
23天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
23天前
|
缓存 Java 数据库
【Java面试题汇总】Spring篇(2023版)
IoC、DI、aop、事务、为什么不建议@Transactional、事务传播级别、@Autowired和@Resource注解的区别、BeanFactory和FactoryBean的区别、Bean的作用域,以及默认的作用域、Bean的生命周期、循环依赖、三级缓存、
【Java面试题汇总】Spring篇(2023版)
|
23天前
|
存储 缓存 监控
【Java面试题汇总】JVM篇(2023版)
JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优
【Java面试题汇总】JVM篇(2023版)
|
23天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
23天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
下一篇
无影云桌面