美文网首页
ThreadPoolExecutor源码

ThreadPoolExecutor源码

作者: littleGrow | 来源:发表于2018-11-08 09:57 被阅读0次

在Android-27中查看源码:

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

corePoolSize:除非设置了allowCoreThreadTimeOut,否则即使它们处于闲置状态,也要在线程池中保留的线程数量

maximumPoolSize:在线程池中允许的最大线程数

keepAliveTime:当线程数超过corePoolSize时,处于闲置状态的非核心线程等待执行新的任务的最大等待时间,超过便会终止。

workQueue:在任务没有执行之前,用来保存任务的队列

threadFactory:用来创建线程的工厂

handler:当达到线程的边界和队列的容量时执行被阻塞,这个时候handler就会被用到

接下来看常用的execute方法:

图1

1、如果线程的数量小于corePoolSize,试图创建一个新线程,将command作为它的第一个任务。调用addWorker时自动检查运行状态和工作线程数量,以便于防止在不能添加线程时添加了线程。当线程数量>=corePoolSize或者添加核心线程失败时走2,3

2、如果一个任务可以成功的加入到队列,我们需要再次检查是否应该添加一个线程,因为再次检查时,已经存在的线程可能已经不在运行了。所以我们需要重新检查线程池状态,如果已经不在运行,就需要将该任务从任务队列删除。或者在没有线程的时候创建一个新的线程。

3、如果我们无法加入队列,我们试图添加一个新的非核心线程。如果失败,我们就知道线程池已经关闭或者已经饱和了,因此拒绝执行该任务。

图2

在图2中的addWorker方法中可以看到线程池的状态处于RUNNING和线程数没有达到最大容量且工作线程的数量小于(核心线程?核心线程数:最大线程数)时就可以将该线程加入到工作线程中,同时启动该线程。其中Thread的源码可以参考Thread源码 - 简书

相关文章

网友评论

      本文标题:ThreadPoolExecutor源码

      本文链接:https://www.haomeiwen.com/subject/gipixqtx.html