简洁之美-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和同步(阻塞)队列,因为后者的性能更优。在下才疏学浅,生怕粗俗肤浅的理解会亵渎高手的代码。因此,文中不当之处,恳请大家批评指正,不胜感激。
相关推荐
阿里云的taobao-sdk-java-auto.jar及源码, 感兴趣的朋友可以下载一下。。。。。。。
MySQL Connector/J是MySQL数据库的Java连接器,它允许Java应用程序通过JDBC(Java Database Connectivity)接口与MySQL数据库进行通信。在本案例中,"mysql-connector-java-5.1.37.jar" 是一个特定版本的MySQL JDBC...
Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] [TablePanel.java] 日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] ...
java thread类源码 thread-pool-source-code JAVA线程池源码解读
在Java中,`java.util.concurrent`包下的`ThreadPoolExecutor`类是线程池的核心实现。它提供了丰富的参数来定制线程池的行为,包括核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、线程存活时间...
项目描述:对java.util.concurrent包下线程池相关源码进行重新实现,深入研究和学习线程池超时机制、饱和策略、生命周期等知识 ThreadPoolExecutor类下部分方法和内部类介绍: 1、Worker类: 描述:Worker类实现...
描述 "Java 线程池完整源码" 说明了这篇文章的内容是关于 Java 线程池的完整实现代码,包括线程池的源代码、配置文件的解析和线程池的管理等方面。 标签解析 标签 "Java 线程池完整源码" 说明了这篇文章的主题是...
在Java环境下,Selenium 提供了一组丰富的库,使得开发者能够用Java语言编写测试脚本。本文将深入探讨Selenium Java JAR文件及其源码,以及它们在"selelnium2"标签中的重要性。 首先,`selenium-2.37.0`是Selenium...
不过,标题中提到的是“易语言完美的线程池源码”,这可能是指使用易语言实现的线程池代码,但标签却是"C++",这可能意味着提供的资源中包含了易语言和C++两种语言关于线程池的示例。 6. **项目文件解析** - `简单...
通过阅读和理解这个源码,我们可以学习到如何利用Kotlin来创建这样一个具有优先级控制的线程池,同时也能看到如何将这个线程池集成到Android应用中,以优化任务执行的效率和顺序。 总之,理解和掌握如何在Android...
本项目源码是个人基于Java实现的线程池,旨在理解和掌握线程池的工作原理。 线程池的核心概念包括以下几个部分: 1. **工作队列(Work Queue)**:线程池内部维护了一个任务队列,用来存储待执行的任务。当提交新...
流行框架:SpringMvc+Spring+mybatis+maven 数据库:mysql web框架:bootstrap,My97DatePickers 定时器任务:job 事务管理:mysql事务处理
本文将深入解析线程池的源码,特别关注其中的`AtomicInteger`类以及线程池状态的表示。 `AtomicInteger`是Java并发包`java.util.concurrent.atomic`中的一个原子类型类,它提供了在多线程环境下安全地修改整型变量...
基于C++11 实现的动态线程池源码示例.zip 【资源说明】 使用 C++11 实现的动态线程池,主要特性: 使用简单,不易出错。 支持线程复用,提升性能。 支持懒惰创建线程。 必要时自动回收空闲的线程。 【快速上手】 #...
本文将深入探讨Java线程池的源码,了解其工作原理和关键组件。 首先,我们来看`ExecutorService`接口,它是线程池的核心接口,提供了执行任务的基本方法,如`execute()`用于提交Runnable任务,`submit()`用于提交...
本资源提供的是一款用Java编写的网站压力测试程序,通过分析其源码,我们可以深入理解如何构建这样的工具。 1. **并发测试原理**: 并发测试是指在模拟多个用户同时访问同一网站或应用的过程,以检验服务器、...
基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java...
这个压缩包 "selenium-java-2.47.1.zip" 包含了Selenium的Java版本,具体是2.47.1的更新,发布于2015年8月。这个版本在当时是一个稳定且广泛使用的版本,它提供了丰富的API,支持多种浏览器,并且可以与各种测试框架...
Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 ...
线程池ThreadPoolExecutor的源码分析,含中文注释,深入了解线程池的构造