线程池数据结构与线程构造方法 - BlogJava.PDF

线程池数据结构与线程构造方法 - BlogJava.PDF

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线程池数据结构与线程构造方法 - BlogJava

深入浅出 Java Concurrency 深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1) 线程池数据结构与线程构造方法 由于已经看到了ThreadPoolExecutor 的源码,因此很容易就看到了ThreadPoolExecutor 线程池的数据结构。图 1 描述了这种数据结构。 图1 ThreadPoolExecutor 数据结构 其实,即使没有上述图形描述ThreadPoolExecutor 的数据结构,我们根据线程池的要求也 很能够猜测出其数据结构出来。  线程池需要支持多个线程并发执行,因此有一个线程集合CollectionThread来执行 线程任务;  涉及任务的异步执行,因此需要有一个集合来缓存任务队列CollectionRunnable;  很显然在多个线程之间协调多个任务,那么就需要一个线程安全的任务集合,同时还需 要支持阻塞、超时操作,那么BlockingQueue 是必不可少的;  既然是线程池,出发点就是提高系统性能同时降低资源消耗,那么线程池的大小就有限 制,因此需要有一个核心线程池大小(线程个数)和一个最大线程池大小(线程个数), 有一个计数用来描述当前线程池大小;  如果是有限的线程池大小,那么长时间不使用的线程资源就应该销毁掉,这样就需要一 个线程空闲时间的计数来描述线程何时被销毁;  前面描述过线程池也是有生命周期的,因此需要有一个状态来描述线程池当前的运行状 态; 深入浅出 Java Concurrency  线程池的任务队列如果有边界,那么就需要有一个任务拒绝策略来处理过多的任务,同 时在线程池的销毁阶段也需要有一个任务拒绝策略来处理新加入的任务;  上面种的线程池大小、线程空闲实际那、线程池运行状态等等状态改变都不是线程安全 的,因此需要有一个全局的锁(mainLock)来协调这些竞争资源;  除了以上数据结构以外,ThreadPoolExecutor 还有一些状态用来描述线程池的运行计 数,例如线程池运行的任务数、曾经达到的最大线程数,主要用于调试和性能分析。 对于ThreadPoolExecutor 而言,一个线程就是一个Worker 对象,它与一个线程绑定, 当Worker 执行完毕就是线程执行完毕,这个在后面详细讨论线程池中线程的运行方式。 既然是线程池,那么就首先研究下线程的构造方法。 public interface ThreadFactory { Thread newThread(Runnable r); } ThreadPoolExecutor 使用一个线程工厂来构造线程。线程池都是提交一个任务Runnable, 然后在某一个线程Thread 中执行,ThreadFactory 负责如何创建一个新线程。 在J.U.C 中有一个通用的线程工厂 java.util.concurrent.Executors.DefaultThreadFactory ,它的构造方式如下: static class DefaultThreadFactory implements ThreadFactory { static final AtomicInteger poolNumber = new AtomicInteger( 1); final ThreadGroup group; final AtomicInteger threadNumber = new AtomicInteger(1); final String namePrefix; DefaultThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null)? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = pool- + poolNumber.g

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档