ThreadPoolExecutor基本原理
2015-08-24 10:56
363 查看
概述
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统