简洁之美-java5线程池源码赏析(下)
by davy
在上篇中,大家了解线程池对线程的控制,本篇将重点介绍线程是如何被复用的。其实关键就在于,addIfUnderCorePoolSize(command)和addIfUnderMaximumPoolSize(command)新建立的线程会不停地从缓冲队列里获取待执行的任务并执行。只要线程池的缓冲队里有任务,线程就不会消亡,就会得到复用。缓冲队列里没有待处理的任务,并且线程超过了预定义的允许空闲时间,线程就会消亡。接下来看一下addIfUnderCorePoolSize(Runnable command)方法,其代码如下:
privateboolean addIfUnderCorePoolSize(Runnable firstTask)
{
Thread t = null;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try
{
if (poolSize < corePoolSize && runState == RUNNING)
t = addThread(firstTask);
} finally
{
mainLock.unlock();
}
if (t == null) returnfalse;
t.start();
returntrue;
}
简单地说,就是先建立线程,并启动线程。我们关心的是线程启动后,其执行的任务时什么。addThread(firstTask)的代码如下:
private Thread addThread(Runnable firstTask)
{
Worker w = new Worker(firstTask);
Thread t = threadFactory.newThread(w);
if (t != null) {
w.thread = t;
workers.add(w);
int nt = ++poolSize;
if (nt > largestPoolSize)
largestPoolSize = nt;
}
return t;
}
Worker是一个内部类,是对真正要执行的任务的包装。Thread t = threadFactory.newThread(w);其实就是新建立了一个Thread实例t,并使该线程t的target=W(即Worker).这样当线程t启动后,Worker.run()会执行。下面就来看一下Worker的真面目吧,代码如下(限于篇幅只贴关键代码):
publicvoid run()
{
Try
{
Runnable task = firstTask;
firstTask = null;
while (task != null || (task = getTask()) != null)
{
runTask(task);
task = null;
}
} finally
{
workerDone(this);
}
}
重点就是while循环,当前处理的任务不为null就执行当前的任务;如果当前处理的任务是null就从线程池的缓冲队列里获取任务来执行。getTask()其实就是从缓冲队列取出任务,不再详细介绍。也就是说,只要缓冲队列里还有待处理的任务,Worker的run()方法就会执行下去,而执行Worker的Thread实例t就不会空闲,不会消亡。这样线程就得到了复用。
篇后语:
高手就是高手,顶级高手的代码没有过多的华丽,其朴素、精炼、简洁令人叹为观止。JDK中随处可见顶级高手的代码,不妨观摩拜读。在jdk1.5线程池的代码中,没有Synchronized关键字,用的都是Lock和同步(阻塞)队列,因为后者的性能更优。在下才疏学浅,生怕粗俗肤浅的理解会亵渎高手的代码。因此,文中不当之处,恳请大家批评指正,不胜感激。
相关推荐
课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言...
JAVA实现的线程池,可以直接在正规大型项目中套用。如果有不懂的,可以问我,QQ:452242541,加时注明csdn
java线程池的源码分析以及各种池之间的对比;
阿里云的taobao-sdk-java-auto.jar及源码, 感兴趣的朋友可以下载一下。。。。。。。
mysql-connector-java-5.1.37jar包和源码下载 最新mysqljar包
Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] [TablePanel.java] 日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] ...
1.媲美java线程池框架,整套源码资源,使用Intellij Idea开发工具,JDK1.8以上 2.带有测试代码 3.可以根据项目实际情况任意调整代码 4.任务队列、拒绝策略 5.BasicThreadPool.java、LinkedRunnableQueue.java、...
java thread类源码 thread-pool-source-code JAVA线程池源码解读
项目描述:对java.util.concurrent包下线程池相关源码进行重新实现,深入研究和学习线程池超时机制、饱和策略、生命周期等知识 ThreadPoolExecutor类下部分方法和内部类介绍: 1、Worker类: 描述:Worker类实现...
线程池管理源码 线程池管理源码 线程池管理源码
java 线程池 完整 源码 java 线程池 完整 源码
超市系统源码--小型JAVA开发-超市系统后台源码 超市系统源码--小型JAVA开发-超市系统后台源码 超市系统源码--小型JAVA开发-超市系统后台源码 超市管理系统源码--JAVA开发-超市系统后台源码
TOMCAT的线程池源码封装,有想学习TOMCAT的线程池源,或者觉得JDK的线程池源码效率不高,可以下载此代码
selenium-java jar文件及源码
线程池源码工程文件 自己用java写的线程池
易语言源码易语言IOCP线程池源码.rar
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
JDK1.5线程池源码及详细注释 深入研究java线程原理
java线程池源码 Java源码学习
非常详细的线程池函数接口分析,可以帮助初学者加深对线程池的理解,更好的去把线程池运用到实例中去,线程池就是多个线程组合在一起的集合,就像一家公司一样,由多个员工组成的一个集合,当有任务时, 这些线程就...