`

简洁之美-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和同步(阻塞)队列,因为后者的性能更优。在下才疏学浅,生怕粗俗肤浅的理解会亵渎高手的代码。因此,文中不当之处,恳请大家批评指正,不胜感激。

分享到:
评论

相关推荐

    课程作业-基于C语言实现线程池源码.zip

    课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言实现线程池源码.zip课程作业-基于C语言...

    java线程池的源码分析.zip

    Java线程池是Java并发编程中的重要组成部分,它在多线程和高并发场景下扮演着关键角色。本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要...

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

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

    线程池管理源码 java 源码

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

    基于java的开发源码-简单扫雷游戏源码.zip

    基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip 基于java的开发源码-简单扫雷游戏源码.zip ...

    TOMCAT的线程池源码

    《深入解析Tomcat线程池源码》 Tomcat作为一款广泛应用的开源Servlet容器,其在性能优化上有着独到之处。线程池是Tomcat处理并发请求的关键组件,它负责调度和管理线程,有效地提高了服务器的响应速度和并发处理...

    基于java的开发源码-通讯录手机版源码.zip

    基于java的开发源码-通讯录手机版源码.zip 基于java的开发源码-通讯录手机版源码.zip 基于java的开发源码-通讯录手机版源码.zip 基于java的开发源码-通讯录手机版源码.zip 基于java的开发源码-通讯录手机版源码.zip ...

    基于java的开发源码-Java SpringMVC+HTML5飞翔的小鸟游戏微信小程序源码.zip

    基于java的开发源码-Java SpringMVC+HTML5飞翔的小鸟游戏微信小程序源码.zip 基于java的开发源码-Java SpringMVC+HTML5飞翔的小鸟游戏微信小程序源码.zip 基于java的开发源码-Java SpringMVC+HTML5飞翔的小鸟游戏...

    超市管理系统源码--JAVA开发-超市系统后台源码

    超市系统源码--小型JAVA开发-超市系统后台源码 超市系统源码--小型JAVA开发-超市系统后台源码 超市系统源码--小型JAVA开发-超市系统后台源码 超市管理系统源码--JAVA开发-超市系统后台源码

    基于java的开发源码-Java swing仿qq聊天软件.zip

    基于java的开发源码-Java swing仿qq聊天软件.zip 基于java的开发源码-Java swing仿qq聊天软件.zip 基于java的开发源码-Java swing仿qq聊天软件.zip 基于java的开发源码-Java swing仿qq聊天软件.zip 基于java的开发...

    selenium-java jar文件及源码

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

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

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

    线程池源码

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

    易语言源码易语言IOCP线程池源码.rar

    综上所述,易语言IOCP线程池源码的学习和理解,不仅可以深化对易语言的理解,也能让你掌握高级的并发处理技术,这对于开发高性能的服务器端应用程序具有很高的价值。通过对源码的分析和实践,你可以更深入地了解异步...

    基于java的开发源码-软件度量源码.zip

    基于java的开发源码-软件度量源码.zip 基于java的开发源码-软件度量源码.zip 基于java的开发源码-软件度量源码.zip 基于java的开发源码-软件度量源码.zip 基于java的开发源码-软件度量源码.zip 基于java的开发源码-...

    线程池源码解析-多线程

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

    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实用简洁的问答_社区系统源码 ...

    基于java的开发源码-Applet钢琴模拟程序源码.zip

    基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发源码-Applet钢琴模拟程序源码.zip 基于java的开发...

Global site tag (gtag.js) - Google Analytics