一.引言

不管是Java面试还是Android面试,线程池都是面试官高频考察的点,那我们怎么回答,才能让面试官了解到我们是真的懂Java线程池了呢?这篇文章不涉及到线程池的使用和原理,如果你还不知道怎么使用线程池,可以先去了解一下。下面我会从几个方面入手循序渐进的告诉你怎么回答这一类问题,并切构建自己的知识体系。

二.线程池是什么,为什么要有线程池?

我们知道线程的创建和销毁都是十分消耗系统资源的,第一涉及到了用户态和核心态的切换,第二就是线程资源的回收。为了提高线程的复用和避免系统资源的浪费,所以就有了线程池这么个东西来对线程进行统一的管理。

三.Java中常见的线程池有几种

这里我们只要说出常见的五种并且剖析一下就可以了。

1.FixedThreadPool

FixedThreadPool 只可以指定核心线程数 没有非核心线程 工作队列使用的是LinkedBlockingQueue无界队列
正因为工作队列是LinkedBlockingQueue所以可能会导致OOM。

2.CacheThreadPool

CacheThreadPool 核心线程数为0,最大线程数没有限制最大为Integer.MAX_VALUE,keepAliveTime默认为60s,工作队列是SynchronousQueue不存储任务的队列。因为最大线程数没有限制,所以可能导致创建线程失败,虚拟内存耗尽从而导致OOM。

3.SingleThreadExecutor

SingleThreadExecutor 核心线程数为1,非核心线程数为0,工作队列使用的是LinkedBlockingQueue无界队列
正因为工作队列是LinkedBlockingQueue所以可能会导致OOM。

4.ScheduledThreadPool

ScheduledThreadPool 可以知道核心线程数,最大线程数没有限制,工作队列是DelayedWorkQueue,可以实现周期性执行任务。因为非核心线程数没有限制,所以可能导致创建线程失败,虚拟内存耗尽从而导致OOM。

5.ForkJoinPool

基于工作窃取和分治思想实现的一个线程池,适合CPU密集型的计算。

四.线程池的工作流程?为什么不要用Java自带的线程池?

这个问题上面已经剖析了,因为Java自带的线程池,要么用的无界队列,要么最大线程数没有做限制,这两种情况在并发任务特别多的时候,都有可能导致OOM。

线程池的构造方法如下:

    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}

在向面试官说线程池的工作流程的时候。先提下现场池的构造方法。
corePoolSize:指定核心线程的数量 根据任务是CPU密集型还是IO密集型来制定核心线程的数量。
CPU密集:corePoolSize = CPU核心数
IO密集:corePoolSize = 2 * CPU核心数 + 1
是比较合适的。

maximumPoolSize:指定线程池中最大线程数限制
非核心线程的最大数量 = maximumPoolSize - corePoolSize

keepAliveTime:非核心线程空闲时间,超过
keepAliveTime ,线程池自动回收非核心线程。如果想这个时间也作用于核心线程可以调用
allowCoreThreadTimeOut方法。

unit:keepAliveTime的时间单位
workQueue:线程池的任务队列
threadFactory:线程工厂,默认为Executors.defaultThreadFactory()
handler:线程池的拒绝策略

工作流程简述:
当我们向线程池提交一个任务时,如果当前线程的数量小于核心线程的数量并且没有空闲的核心线程,那么就创建一个线程来处理这个任务。如果核心线程数满了,就把任务扔到任务队列中等待执行。此时如果任务队列也满了,但是线程池中的线程数量小于最大线程数的限制,则创建非核心线程来处理提交的任务。如果此时达到了最大线程数的限制,则执行饱和策略
Java提供了四种饱和策略供我们使用:
1.AbortPolicy 抛出异常(默认策略)
2.DiscardPolicy 丢弃当前提交的任务
3.DiscardOldestPolicy 丢弃任务队列中最老的任务
4.CallRunnerPolicy 当前提交任务的线程执行任务
当然也可以自定义自己的饱和策略哈。

五.提交任务的方法?

向线程池提供任务一共有两种方法:
1.execute 不带返回值
2.submit 返回值为Future对象。如果需要知道提交任务什么时候被执行完成或者执行的任务需要返回值,使用submit来提交任务,需要注意的是调用Future#get()方法时,会阻塞当前线程,直到任务执行完成并返回。

六.停止当前线程池的方法

停止线程池的方法一样有两种:
shutDownshutDownNow方法。

shutDown 和 shutDownNow 遍历线程池的工作线程 调用interrupt方法 如果任务不响应中断可能永远无法被停止。
shutDownNow首先将线程池状态设置为stop 然后尝试停止所有正在执行或暂停任务的线程。
shutDown将线程池的状态设置为shutdown 然后中断所有没有正在执行任务的线程。
调用两个任意一个isShutDown会返回true 任务都关闭 isTerminated返回true。

七.线程池的监控

Java为我们提供了一些默认的Api方法供我们完成对线程池的监控。
getTaskCount():线程池需要执行的任务数量
getCompletedTaskCount():线程池运行过程中已完成的任务数量
getLargestPoolSize():线程池中曾经创建过的最大线程数量
getPoolSize():线程池的线程数量
getActiviteCount()活动的线程数
我们继承线程池自定义自己的线程池 在合适的时机观察这些方法的返回的值。

八.总结

在回答面试官的每个问题时,脑海中都要有个自己的知识体系,然后在把自己的知识体系,完整的呈现在面试官的面前,让面试官知道你是真的懂了,不要让面试官主动来追问你,这一点是非常重要的。这样能够大大增加面试的通过率哦~

面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了!相关推荐

  1. java线程池原理简答_面试官让我讲讲Java线程池的实现原理,我笑了...

    期待与你,一起进步 随着cpu核数越来越多,不可避免的利用多线程技术以充分利用其计算能力.所以,多线程技术是服务端开发人员必须掌握的技术. 线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就 ...

  2. 突然就懵了!面试官问我:线程池中多余的线程是如何回收的?

    点击关注公众号,Java干货及时送达 最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多 ...

  3. 面试必问---Java线程池8大拒绝策略

    前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...

  4. Java 线程池 8 大拒绝策略,面试必问!

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:KL博客 kailing.pub/article/index/arcid/255.h ...

  5. java线程池_Java 线程池 8 大拒绝策略,面试必问!

    点击上方 Java后端,选择设为星标 技术博文,及时送达 前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的 ...

  6. 面试必备:Java线程池解析

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://juejin.im/post/5d1882b1f265da1ba84aa ...

  7. Java面试系列之并发编程专题-Java线程池灵魂拷问

    金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...

  8. 【020期】面试官问:Java 遍历 Map 集合有几种方式?效率如何?

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  9. Java 线程池及参数动态调节详解

    前前言:本文搬自:why技术 前言:曾经自诩对线程池了如指掌,不料看了美团的一篇技术文章后才知道原来线程池的参数还可以动态调节. 经典面试题 在这篇文章中我主要回答上面抛出的这个问题:你这几个参数的值 ...

最新文章

  1. 中科大 × MSRA | 周明博士讲座实录:自然语言处理让生活更美好
  2. 远程控制 vc++实现
  3. 关于 OData 协议的数据类型 - SAP gateway 框架是如何解析数据类型的?
  4. 【结论】只不过是长的领带(luogu 6877)
  5. GARFIELD@12-30-2004
  6. Linux桌面需要强制访问控制,RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...
  7. 几种开源软件授权协议
  8. OpenVINO主要工作流程
  9. 如何在windows下安装GIT
  10. python 比较文件不同,在python中逐行比较两个不同的文件
  11. 54.用环信实现聊天功能
  12. 一篇文章教你用 java爬虫 下载全站视频
  13. PoE交换机可以当普通交换机吗?
  14. gorm中一对一,多对多关系
  15. c语言足球管理系统,如足球一般优美的C语言
  16. 解决:Excel 下拉项数据报 输入内容不能大于255个字符
  17. 2.1.2笼形天线、V形对称天线、电视发射天线
  18. ubuntu安装nvidia显卡驱动黑屏nvidia-smi黑屏-显卡故障
  19. Python实战|js逆向微信公众平台
  20. 人员考勤,MySQL数据库一个表自动生成3表筛选人员迟到早退缺勤

热门文章

  1. 75佳精美的 CSS 网页设计作品欣赏(系列一)
  2. 计算机网络——第二章
  3. 第二十三章 SQL函数 CAST(二)
  4. 如何用mysql求质数_PLSQL计算质数
  5. Ubuntu18.04装录屏软件OBS-Studio 21.1
  6. 中 华 百 家 姓 一 览
  7. 蒲公英wifi怎么卸载干净_蒲公英WiFi广告怎么彻底删除
  8. 解决 “VS2015 的warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”的方法
  9. 基于web 3d 演示_评论:排名前五的基于Web的演示工具比较
  10. (一)公主连结游戏拆解