`

简洁之美-java5线程池源码赏析(下)

阅读更多

简洁之美-java5线程池源码赏析(下)

            by  davy

在上篇中,大家了解线程池对线程的控制,本篇将重点介绍线程是如何被复用的。其实关键就在于,addIfUnderCorePoolSizecommand)和addIfUnderMaximumPoolSize(command)新建立的线程会不停地从缓冲队列里获取待执行的任务并执行。只要线程池的缓冲队里有任务,线程就不会消亡,就会得到复用。缓冲队列里没有待处理的任务,并且线程超过了预定义的允许空闲时间,线程就会消亡。接下来看一下addIfUnderCorePoolSizeRunnable 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,并使该线程ttarget=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()其实就是从缓冲队列取出任务,不再详细介绍。也就是说,只要缓冲队列里还有待处理的任务,Workerrun()方法就会执行下去,而执行WorkerThread实例t就不会空闲,不会消亡。这样线程就得到了复用。

    篇后语:

    高手就是高手,顶级高手的代码没有过多的华丽,其朴素、精炼、简洁令人叹为观止。JDK中随处可见顶级高手的代码,不妨观摩拜读。在jdk1.5线程池的代码中,没有Synchronized关键字,用的都是Lock和同步(阻塞)队列,因为后者的性能更优。在下才疏学浅,生怕粗俗肤浅的理解会亵渎高手的代码。因此,文中不当之处,恳请大家批评指正,不胜感激。

分享到:
评论

相关推荐

    taobao-sdk-java-auto源码

    阿里云的taobao-sdk-java-auto.jar及源码, 感兴趣的朋友可以下载一下。。。。。。。

    mysql-connector-java-5.1.37jar包和源码

    MySQL Connector/J是MySQL数据库的Java连接器,它允许Java应用程序通过JDBC(Java Database Connectivity)接口与MySQL数据库进行通信。在本案例中,"mysql-connector-java-5.1.37.jar" 是一个特定版本的MySQL JDBC...

    java源码包---java 源码 大量 实例

     Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格面板  [ConfigLine.java] 控制条类  [RoundBox.java] ...

    javathread类源码-thread-pool-source-code:JAVA线程池源码解读

    java thread类源码 thread-pool-source-code JAVA线程池源码解读

    线程池管理源码 java 源码

    在Java中,`java.util.concurrent`包下的`ThreadPoolExecutor`类是线程池的核心实现。它提供了丰富的参数来定制线程池的行为,包括核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、线程存活时间...

    java线程池源码-cThreadPool:JAVA线程池源码分析与重写

    项目描述:对java.util.concurrent包下线程池相关源码进行重新实现,深入研究和学习线程池超时机制、饱和策略、生命周期等知识 ThreadPoolExecutor类下部分方法和内部类介绍: 1、Worker类: 描述:Worker类实现...

    java线程池完整代码

    描述 "Java 线程池完整源码" 说明了这篇文章的内容是关于 Java 线程池的完整实现代码,包括线程池的源代码、配置文件的解析和线程池的管理等方面。 标签解析 标签 "Java 线程池完整源码" 说明了这篇文章的主题是...

    selenium-java jar文件及源码

    在Java环境下,Selenium 提供了一组丰富的库,使得开发者能够用Java语言编写测试脚本。本文将深入探讨Selenium Java JAR文件及其源码,以及它们在"selelnium2"标签中的重要性。 首先,`selenium-2.37.0`是Selenium...

    易语言完美的线程池源码

    不过,标题中提到的是“易语言完美的线程池源码”,这可能是指使用易语言实现的线程池代码,但标签却是"C++",这可能意味着提供的资源中包含了易语言和C++两种语言关于线程池的示例。 6. **项目文件解析** - `简单...

    Android-AppExecutor应用线程池可以指定任务的优先级完全kotlin

    通过阅读和理解这个源码,我们可以学习到如何利用Kotlin来创建这样一个具有优先级控制的线程池,同时也能看到如何将这个线程池集成到Android应用中,以优化任务执行的效率和顺序。 总之,理解和掌握如何在Android...

    线程池源码

    本项目源码是个人基于Java实现的线程池,旨在理解和掌握线程池的工作原理。 线程池的核心概念包括以下几个部分: 1. **工作队列(Work Queue)**:线程池内部维护了一个任务队列,用来存储待执行的任务。当提交新...

    P2P借贷项目--java源码+MySQL

    流行框架:SpringMvc+Spring+mybatis+maven 数据库:mysql web框架:bootstrap,My97DatePickers 定时器任务:job 事务管理:mysql事务处理

    线程池源码解析-多线程

    本文将深入解析线程池的源码,特别关注其中的`AtomicInteger`类以及线程池状态的表示。 `AtomicInteger`是Java并发包`java.util.concurrent.atomic`中的一个原子类型类,它提供了在多线程环境下安全地修改整型变量...

    基于C++11 实现的动态线程池源码示例.zip

    基于C++11 实现的动态线程池源码示例.zip 【资源说明】 使用 C++11 实现的动态线程池,主要特性: 使用简单,不易出错。 支持线程复用,提升性能。 支持懒惰创建线程。 必要时自动回收空闲的线程。 【快速上手】 #...

    java线程池源码-java-source:Java源码学习多线程、线程池、集合

    本文将深入探讨Java线程池的源码,了解其工作原理和关键组件。 首先,我们来看`ExecutorService`接口,它是线程池的核心接口,提供了执行任务的基本方法,如`execute()`用于提交Runnable任务,`submit()`用于提交...

    网站压力测试程序----附带java源码

    本资源提供的是一款用Java编写的网站压力测试程序,通过分析其源码,我们可以深入理解如何构建这样的工具。 1. **并发测试原理**: 并发测试是指在模拟多个用户同时访问同一网站或应用的过程,以检验服务器、...

    基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip

    基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java的开发源码-泡泡堂战车游戏JAVA版源码.zip 基于java...

    selenium-java-2.47.1.zip

    这个压缩包 "selenium-java-2.47.1.zip" 包含了Selenium的Java版本,具体是2.47.1的更新,发布于2015年8月。这个版本在当时是一个稳定且广泛使用的版本,它提供了丰富的API,支持多种浏览器,并且可以与各种测试框架...

    Java实用简洁的问答_社区系统源码.zip

    Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 Java实用简洁的问答_社区系统源码 ...

    线程池源码分析

    线程池ThreadPoolExecutor的源码分析,含中文注释,深入了解线程池的构造

Global site tag (gtag.js) - Google Analytics