概述
ThreadPoolExecutor是Java中最基本的线程池实现,Executors类的工厂方法newFixedThreadPool()、newCachedThreadPool()、newSingleThreadPool()等,内部都是用ThreadPoolExecutor实现的。
内部类Worker
线程池中实际执行任务的基本工作单元。
基本成员
Thread thread:供Worker运行的线程,也即线程池的工作线程。Runnable firstTask:初始化Worker类时传入的Runnable对象。
构造Worker对象时,需要传入firstTask,也就是这个Worker将要运行的第一个Runnable。同时构造函数中会为Worker生成一个新的线程。
工作循环
线程池比一般的线程高级的地方在于,它实现了线程复用,同一个线程执行完一个任务后可以继续执行下一个任务,而一般的线程在执行完后就废弃了,因为Thread.start()方法只能调用一次。
线程池中的线程复用是由工作循环实现的,Worker类实现了Runnable接口,它的run()方法就是一个无限循环,负责不断地获得并执行任务。
因为构造Worker类时传入了firstTask,所以第一次循环会执行firstTask,此后的循环,则会从workerQueue中取出Runnable执行。
线程管理
与线程管理有关的属性:
int corePoolSize:核心线程数int maxPoolSize:最大线程数BlockingQueue workerQueue:等待队列
线程产生
当调用ThreadPoolExecutor.execute(Runnable runnable)方法提交新任务时,会按照以下步骤处理:
- 如果现有线程数量小于
corePoolSize,则新建一个Worker对象,传入的Runnable即为该Worker的firstTask,并使得Worker对于的Thread开始运行。 - 如果该
Runnable可以放入workerQueue,则放入workerQueue。 - 如果
workerQueue已满,则判断当前线程数是否小于maxPoolSize,若满足,则新建一个Worker对象运行传入的Runnable,若不满足,则reject该Runnable。
线程销毁
当某个Worker执行完一个Runnable,从workerQueue中获取新任务时,如果在给定的阻塞时间内获取不到任务,且当前线程数量大于corePoolSize,则该Worker关闭。通俗的说,只有当任务很多时,线程数量才会超过corePoolSize,比较空闲的时候,线程数量会保持在corePoolSize。
本文详细介绍了Java中ThreadPoolExecutor线程池的实现原理,包括其内部类Worker的作用、线程池的基本成员变量、线程的复用机制以及线程的产生和销毁过程。
682

被折叠的 条评论
为什么被折叠?



