Java线程池面试题

1、什么是线程池

java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。
假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。

如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。

一个线程池包括以下四个基本组成部分:
1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。
线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子:
假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

2.常见线程池

newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
newFixedThreadExecutor(n)
固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
newCacheThreadExecutor(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
newScheduleThreadExecutor
大小无限制的线程池,支持定时和周期性的执行线程

java提供的线程池更加强大,相信理解线程池的工作原理,看类库中的线程池就不会感到陌生了。
在这里插入图片描述

在这里插入图片描述

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

2.1 newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.2 newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

2.3 newCachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

2.4 newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

3 为什么不建议使用 Executors静态工厂构建线程池

阿里巴巴Java开发手册,明确指出不允许使用Executors静态工厂构建线程池
原因如下:
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险

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

1:FixedThreadPool 和 SingleThreadPool:
允许的请求队列(底层实现是LinkedBlockingQueue)长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM
2:CachedThreadPool 和 ScheduledThreadPool
允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
在这里插入图片描述
创建线程池的正确姿势

避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue指定容量就可以了。

private static ExecutorService executor = new ThreadPoolExecutor(10, 10,60L, TimeUnit.SECONDS,new ArrayBlockingQueue(10));

或者是使用开源类库:开源类库,如apache和guava等。

3、线程池常用参数

/*** Creates a new {@code ThreadPoolExecutor} with the given initial* parameters.** @param corePoolSize the number of threads to keep in the pool, even*        if they are idle, unless {@code allowCoreThreadTimeOut} is set* @param maximumPoolSize the maximum number of threads to allow in the*        pool* @param keepAliveTime when the number of threads is greater than*        the core, this is the maximum time that excess idle threads*        will wait for new tasks before terminating.* @param unit the time unit for the {@code keepAliveTime} argument* @param workQueue the queue to use for holding tasks before they are*        executed.  This queue will hold only the {@code Runnable}*        tasks submitted by the {@code execute} method.* @param threadFactory the factory to use when the executor*        creates a new thread* @param handler the handler to use when execution is blocked*        because the thread bounds and queue capacities are reached* @throws IllegalArgumentException if one of the following holds:<br>*         {@code corePoolSize < 0}<br>*         {@code keepAliveTime < 0}<br>*         {@code maximumPoolSize <= 0}<br>*         {@code maximumPoolSize < corePoolSize}* @throws NullPointerException if {@code workQueue}*         or {@code threadFactory} or {@code handler} is null*/public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) { }

corePoolSize:核心线程数量,会一直存在,除非allowCoreThreadTimeOut设置为true
maximumPoolSize:线程池允许的最大线程池数量
keepAliveTime:线程数量超过corePoolSize,空闲线程的最大超时时间
unit:超时时间的单位
workQueue:工作队列,保存未执行的Runnable 任务
threadFactory:创建线程的工厂类
handler:当线程已满,工作队列也满了的时候,会被调用。被用来实现各种拒绝策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313851.shtml

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

相关文章

F. Cheap Robot(kruskal 重构树)

F. Cheap Robot 给定一个无向连通图&#xff0c;每条边有边权&#xff0c;路过需要消耗对应的电量&#xff08;边权&#xff09;&#xff0c;有kkk个中心点&#xff0c; 问从a−>ba-> ba−>b&#xff0c;我们最少需要带多少电&#xff0c;设最小为CCC&#xff0c;当…

「标签管理」使用标签管理有道云笔记资料

因着大家对文件标签化比较高难道&#xff0c;需要熟悉一个标签工具软件&#xff0c;所以今天暂时来介绍个简单一些的网络资料的标签化管理&#xff0c;使用有道云笔记作为落地工具&#xff0c;同理在OneNote、印象笔记上原理类似。有道云笔记免费功能够用为了选择哪个笔记产品&…

JDK线程池实现

参见&#xff1a; https://www.cnblogs.com/trust-freedom/p/6594270.html http://ifeve.com/java-threadpool/ https://blog.csdn.net/u010963948/article/details/80573898 https://blog.csdn.net/moakun/article/details/80606029 https://www.cnblogs.com/liuzhihu/p/81773…

Problem G. Pandaria(线段树合并 + Kruskal 重构树)

Problem G. Pandaria 给定一个有nnn条边的无向连通图&#xff0c;每条边有对应的边权&#xff0c;每个点有一个颜色&#xff0c; 问从一个点出发&#xff0c;经过不超过www的边权&#xff0c;所能到达的点中&#xff0c;颜色出现次数做多且颜色编号最小的是什么颜色。 不超过…

我如何吸引Elastic创始人一起对高并发写入进行优化?

导语&#xff1a;在腾讯金融科技数据应用部的全民 BI 项目里&#xff0c;我们每天面对超过 10 亿级的数据写入&#xff0c;提高 ES 写入性能迫在眉睫&#xff0c;在最近的一次优化中&#xff0c;有幸参与到了 Elasticsearch 开源社区中。背景为了更便捷地分析数据&#xff0c;腾…

Java线程安全

Java 线程安全 什么是线程安全&#xff1f; 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 一&#xff1a;基本概念 共享资源&#xff1a;能够被多个线程同时访问的资源竞态条件&#xff1a;当两个线程竞争统…

P4899 [IOI2018] werewolf 狼人(kruskal 重构树 + 主席树)

P4899 [IOI2018] werewolf 狼人 给定一个有nnn个点mmm条边的无向图&#xff0c;有QQQ个询问 每次输入S,E,L,RS, E, L, RS,E,L,R&#xff0c;表示你在SSS点出发&#xff0c;要到EEE点&#xff0c;且初始时你是人形态&#xff0c;你只能走[L,n][L, n][L,n]的点&#xff0c; 但…

微软+开源,那些亲爱的以及热爱的

微软 Reactor 社区空间开幕式暨 Azure Meetup 社区活动已于9月7日在上海圆满结束&#xff01;但是…如何构建一个可持续发展的社区未来的路&#xff0c;仍然很长...你应该知道的微软 Reactor微软 Reactor 是微软为构建开发者社区而提供的一个社区空间&#xff0c;以“予力多元…

Java线程问题问答

1、多线程的作用&#xff1f; 发挥多核CPU的优势&#xff0c;提高效率防止阻塞便于建模&#xff1a;将一个任务拆分成多个子任务&#xff0c;分别建立程序模型 2&#xff1a;平时项目中使用锁和synchronized比较多&#xff0c;而很少使用volatile&#xff0c;难道就没有保证可见…

ASP.NET Core 2.2 项目升级至 3.0 备忘录

.NET Core 3.0及ASP.NET Core 3.0 前瞻ASP.NET Core 3.0 迁移避坑指南将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中。TargetFramework 改为 netcoreapp3.0 <TargetFramework>netcoreapp3.0</TargetFramework>从 Web 项目&#xff…

Java 死锁

目录&#xff1a; 什么是死锁&#xff1f;死锁是怎么产生的&#xff1f;怎么排查死锁&#xff1f;死锁的预防拓展&#xff1a;Java CPU 100%排查 一 什么是死锁&#xff1f; 注&#xff1a;线程和进程都可能会产生死锁&#xff0c;以下以线程为例 死锁是指两个或两个以上的…

CF196E Opening Portals

CF196E Opening Portals 给定一个有nnn个节点&#xff0c;mmm条边的无向联通图&#xff0c;有kkk个点有portalsportalsportals&#xff0c;当经过了某个点&#xff0c;如果这个点有portalportalportal&#xff0c;它就会永久开启&#xff0c; 对于任意两个开启的portalportal…

.NET Core 微信小程序退款——(统一退款)

点击上方“dotNET名人堂”&#xff0c;选择“设为星标”用学习的姿态&#xff0c;步入工作的状态继上一篇".NET Core 微信小程序支付——&#xff08;统一下单&#xff09;后"&#xff0c;本文将实现统一退款功能&#xff0c;能支付就应该能退款嘛&#xff0c;一般涉…

Java 锁之 CAS

什么是CAS(compare and swap)&#xff1f; CAS&#xff08;Compare & Set&#xff0c;或是 Compare & Swap&#xff09;&#xff0c;即比较并交换&#xff0c;也是实现我们平时所说的自旋锁或乐观锁的核心操作。 它的实现很简单&#xff0c;就是用一个预期的值和内存…

牛客练习赛71 F 红蓝图(kruskal重构树)

红蓝图 给定两个参数x,tx, tx,t&#xff0c;删除边权大于ttt的红边&#xff0c;和边权小于ttt的蓝边&#xff0c;问对于所有的点yyy&#xff0c;既能通过红边走向xxx&#xff0c;又能通过蓝边走向xxx&#xff0c;的点有多少个。 考虑对红边按照边权升序建立一颗kruskalkruska…

.NET 分布式自增Id组件(解决自动分配机器Id、时间回拨问题)

IdHelper是一个.NET&#xff08;支持.NET45或.NET Standard2&#xff09;生成分布式趋势自增Id组件&#xff0c;有两个版本&#xff1a;原始版为基于雪花Id&#xff08;不了解请自行百度&#xff09;方案&#xff0c;需要手动管理设置WorkerId&#xff1b;完美版在原始版的基础…

悲观锁与乐观锁

悲观锁 总是假设最坏的情况&#xff0c;每次取数据的时候都认为别人会来修改&#xff0c;所以每次取数据的时候都会上锁。其它线程想要取这份数据就必须拿到相应的锁&#xff08;共享资源每次只供一个线程使用&#xff0c;其它线程阻塞&#xff0c;用完之后转让给其他线程&…

1190 最小公倍数之和 V2

1190 最小公倍数之和 V2 ∑iablcm(i,b)∑iabibgcd⁡(i,b)b∑d∣b∑i⌈ad⌉bdi[gcd(i,bd)1]b∑d∣b∑k∣bdμ(k)k∑i⌈⌈ad⌉k⌉abkib∑T∣n∑i⌈aT⌉bTi∑k∣Tμ(k)kb∑T∣n(bT⌈aT⌉)(bT−⌈aT⌉1)2∑k∣Tμ(k)k设f(n)∑d∣nμ(d)d,f(1)1,f(p)1−p,f(pk)1−p,且为积性函数\sum…

有关 VS Code 的五大谣言,背后的真相到底是如何的?

2015 年 4 月 29 日&#xff0c;在微软 Build 2015 大会上&#xff0c;微软发布了 Visual Studio Code 第一个预览版本。随着 Visual Studio Code 有了越来越多的使用者&#xff0c;随之而来的各类谣言也层出不穷。让我们就来看看有哪些与 VS Code 相关的谣言&#xff0c;背后的…

Mysql数据库锁机制

一&#xff1a;概念介绍 MySQL数据库锁管理机制&#xff1a; SQL层实现的锁机制    Meta-data元数据锁&#xff1a;在table cache缓存里实现的&#xff0c;为DDL&#xff08;Data Definition Language&#xff09;提供隔离操作。一种特别的meta-data元数据类型&#xff0c;…