乐趣区

关于java:JAVA面试系列-线程池的构造

概述

平时面试候选人,聊到线程池的时候难免会顺带着考查下 ThreadPoolExecutor 构造函数中各参数的含意,在这里做一个简略的总结。

ThreadPoolExecutor 结构参数阐明

其实从源码中的 JavaDoc 曾经能够很清晰地明确这些参数的含意了,上面关照懒得看英文的同学,再解释一下:

  • corePoolSize

线程池外围线程数。

默认状况下外围线程会始终存活,即便处于闲置状态也不会受存 keepAliveTime 限度,除非将 allowCoreThreadTimeOut 设置为true

  • maximumPoolSize

线程池所能包容的最大线程数。超过 maximumPoolSize 的线程将被阻塞。

最大线程数 maximumPoolSize 不能小于corePoolSize

  • keepAliveTime

非核心线程的闲置超时工夫。

超过这个工夫非核心线程就会被回收。

  • TimeUnit

keepAliveTime的工夫单位,如 TimeUnit.SECONDS。

当将 allowCoreThreadTimeOut 为 true 时,对 corePoolSize 失效。

  • workQueue

线程池中的工作队列。

没有取得线程资源的工作将会被放入 workQueue,期待线程资源被开释。如果放入workQueue 的工作数大于 workQueue 的容量,将由 RejectedExecutionHandler 的回绝策略进行解决。

罕用的有三种队列:SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue

  • threadFactory

提供创立新线程性能的线程工厂。

ThreadFactory是一个接口,只有一个 newThread 办法:

Thread newThread(Runnable r);
复制代码
  • rejectedExecutionHandler

无奈被线程池解决的工作的处理器。

个别是因为工作数超出了 workQueue 的容量。

当一个工作被退出线程池时

总结一下,当一个工作通过 execute(Runnable) 办法增加到线程池时:

  1. 如果此时线程池中线程的数量小于corePoolSize,即便线程池中的线程都处于闲暇状态,也要创立新的线程来解决被增加的工作。
  2. 如果此时线程池中的数量等于 corePoolSize,然而缓冲队列workQueue 未满,那么工作被放入缓冲队列。
  3. 如果此时线程池中的数量大于 corePoolSize,缓冲队列workQueue 满,并且线程池中的数量小于maximumPoolSize,建新的线程来解决被增加的工作。
  4. 如果此时线程池中的数量大于 corePoolSize,缓冲队列workQueue 满,并且线程池中的数量等于maximumPoolSize,那么通过 handler 所指定的回绝策略来解决此工作。

解决工作的优先级为:外围线程数(corePoolSize) > 工作队列容量(workQueue) > 最大线程数(maximumPoolSize); 如果三者都满了,应用 rejectedExecutionHandler 解决被回绝的工作。

参考文档

  • Java 并发 之 线程池系列 (2) 应用 ThreadPoolExecutor 结构线程池
退出移动版