谈谈你对Java线程池的理解

Java面试 潘老师 8个月前 (09-04) 171 ℃ (0) 扫码查看

Java面试题:谈谈你对Java线程池的理解?

得分点:

核心参数、处理流程、拒绝策略

标准回答:

线程池是一种用来管理和复用线程的机制,可以有效地管理线程的数量,避免无节制地创建线程,从而提高系统的性能和稳定性。线程池依赖一些核心参数来控制任务的执行流程,其中最重要的参数包括:

  1. corePoolSize(核心线程数):线程池的初始线程数量,即在没有任务提交时线程池维持的线程数。
  2. workQueue(等待队列):用于存储等待执行的任务的队列,任务提交后会先进入等待队列。
  3. maximumPoolSize(最大线程数):线程池允许创建的最大线程数量。
  4. handler(拒绝策略):当任务无法被接收时采取的策略,例如队列已满或线程数已达到最大值时。
  5. keepAliveTime(空闲线程存活时间):空闲线程在超过这个时间后会被终止,直到线程数量减少到corePoolSize

线程池的处理流程如下:

  1. 判断线程数是否达到corePoolSize,若未达到则新建线程执行任务,否则进入下一步。
  2. 判断等待队列是否已满,若未满则将任务放入等待队列,否则进入下一步。
  3. 判断线程数是否达到maximumPoolSize,如果未达到则新建线程执行任务,否则进入下一步。
  4. 根据指定的拒绝策略来处理任务,可能的策略包括让调用者自己执行、直接抛出异常、丢弃任务不做任何处理、删除队列中最老的任务并将当前任务加入队列。这些策略对应RejectedExecutionHandler接口的不同实现。
  5. 新建的线程处理完当前任务后不会立刻关闭,而是继续处理等待队列中的任务。如果线程的空闲时间达到了keepAliveTime,则线程池会销毁一部分线程,将线程数量收缩至corePoolSize

在Java中,线程池的实际类型是ThreadPoolExecutor,它提供了线程池的常规用法。还有一个子类叫做ScheduledThreadPoolExecutor,它对定时任务提供了支持,可以周期性地重复执行某个任务,或者延迟一定时间后再执行某个任务。

加分回答:

线程池的生命周期包含5个状态,每个状态对应一个整数值,分别是:

  1. RUNNING:表示线程池正在运行。
  2. SHUTDOWN:当执行shutdown()方法时进入该状态,此时线程池不会接受新的任务,但会等待已提交的任务执行完毕。
  3. STOP:当执行shutdownNow()方法时进入该状态,此时线程池会立即停止,不再等待任务执行完毕,会清空队列中的任务。
  4. TIDYING:当线程池和等待队列都为空时进入该状态,此时线程池会执行钩子函数(Hook Methods),目前该函数是一个空的实现。
  5. TERMINATED:在钩子函数执行完毕后,线程池进入该状态,表示线程池已经被终止。线程池的状态只能由小到大迁移,是不可逆的。

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/javainterview/8638.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】