`
songzi0206
  • 浏览: 158626 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
Group-logo
All are from ...
浏览量:33780
Group-logo
Programming w...
浏览量:19645
社区版块
存档分类
最新评论
阅读更多

         既然最终任务都是由execute(Runnable)方法执行,就直接来看该方法实现的所在类。

首当其冲肯定是类ThreadPoolExecutor了,相信他是java concurrent包中用的最多的一个

线程池执行器,包括springThreadPoolTaskExecutor也是利用它来执行任务的。从类的

“家谱”来看,ThreadPoolExecutor直接继承自AbstractExecutorService,因此必须实现的方

法只有public void execute(Runnable command),查看之发现和想象不一样(原以为他会直接

以此runnable创建一个thread然后直接start, ^_^),他内部还会其他的执行逻辑,那是因

ThreadPoolExecutor内部会维护一个线程池,所以有很多额外的操作。所以接下来需要

先来分析一下该类。

         首先定义了线程执行的四种状态,便于跟踪:

volatile int runState; 
static final int RUNNING = 0; 
static final int SHUTDOWN = 1; 
static final int STOP = 2; 
static final int TERMINATED = 3; 

 

 

 

         其次,定义了三个表示大小的int类型

//核心线程池大小 
private volatile int corePoolSize; 
//线程池允许的最大线程数量 
private volatile int maximumPoolSize; 
//当前线程池中的线程数量 
private volatile int poolSize; 

 

 

 

 

再仔细看,发现ThreadPoolExecutor主要依赖于以下类或接口:

1)      BlockingQueue<Runnable>

用于传输和保持提交的任务,可以使用此队列与池大小进行交互

Ø  如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。

Ø  如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。

Ø  如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝

     任务排队等待执行,排队的策略根据不同的BlockingQueue实现类型不同,具体 

  SynchronousQueue(直接提交策略,这是默认值),LinkedBlockingQueue(无界队列),

ArrayBlockingQueue(有界队列)等。

 

2)      RejectedExecutionHandler

用来拒绝一个任务的执行,有两种情况会发生这种情况。一是在execute方法中若

addIfUnderMaximumPoolSize(command)false,即线程池已经饱和;二也是在execute方法中, 发现runState!=RUNNING || poolSize == 0,即已经shutdown,就调用ensureQueuedTaskHandled(Runnable command),在该方法中有可能调用rejectReject策略预定义有四种:

Ø  在默认的 ThreadPoolExecutor.AbortPolicy 中,处理程序遭到拒绝将抛出运行时 RejectedExecutionException

Ø  ThreadPoolExecutor.CallerRunsPolicy 中,线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速

Ø  ThreadPoolExecutor.DiscardPolicy 中,不能执行的任务将被删

Ø  ThreadPoolExecutor.DiscardOldestPolicy 中,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)

 

1)      ThreadFactory

         默认使用Executors.DefaultThreadFactory,主要用来创建线程,统一设置线程的一些属性(名字、分组、优先级、是否后台线程等)。也可以使用自定义ThreadFactory,若有需要的话,比如想设置线程的UncaughtExceptionHandler等。

 

2)      ThreadPoolExecutor.Worker

            ThreadPoolExecutor是把线程包装成Worker对象运行的,这里要弄清一个概念,ThreadPoolExecutor用来执行线程Thread, 而线程Thread执行会去运行任务Runnable,所以ThreadPoolExecutor也可以说成任务执行器。还记得上一篇讲到submit,invokeAll等方法会将Runnable任务包装成FutureTask运行的。

            包装也可以理解成代理,一旦有了代理对象,就可以在运行目标对象的时候做很多有意义的事情,Spring很多强悍的功能都是基于代理实现,有点说远了,但是以后的分析中将会体会到这个包装确实起到很大的作用。

 

3)      TimeUnit

 

这个枚举是java  concurrent提供的工具,主要提供时间不同粒度单元之间的转换和执行计时以及延迟操作等。

 

4)      ReentrantLock

         关于java.util.concurrent.lock包以后会详细写,这里简单介绍下。这是一个可重入的互斥锁,实现了synchronized隐式监视器锁差不多的功能,但是粒度更细,功能更强。Synchronized在语义的层次实现,它是不能被中断的;而Lock是在java语法层面实现,它可以被中断。这个很重要,Java concrruent不鼓励直接使用Thread.interrupt等方法来中断,而尽量使用Executor来执行所有的操作。Executorshutdown或者在提交任务后返回的future中执行cancel的话,底层会调用interrupt来结束线程。ThreadPoolExecutor需要对线程执行进行跟踪管理,同步自然要用灵活且可以中断的Lock,而不可能去使用synchronized

5)      Condition

     Lock替代了synchronizedcondition用来替代Object的监视器方法(wait,notifyAll, notify) 

        

        到此,基本上算是弄清了ThreadPoolExecutor的结构,具体的功能分析看来得放到下一篇了,基本类图可以参考如下: 

 

     

  • 大小: 101.1 KB
分享到:
评论

相关推荐

    《IT学习资料》-Java架构师学习.zip

    你可能找到关于Java并发API的详细讲解,包括`java.util.concurrent`包下的Thread、Runnable、ExecutorService、Semaphore、CountDownLatch、CyclicBarrier、ThreadPoolExecutor等类的使用方法。此外,还可能探讨了...

    Java Performance

    1. JVM架构:JVM是Java平台的核心组成部分,它负责执行字节码并提供内存管理、类加载、垃圾收集等服务。 2. 类加载机制:JVM通过类加载器将类文件加载到内存中,并确保它们在运行时的正确性。 3. 字节码解释与即时...

    java面试题库 整合完美收藏版

    1. 类加载优化:了解类加载过程,分析类加载性能问题。 2. 内存调优:堆内存分配、新生代与老年代的调整。 3. 方法调优:JIT编译、方法内联等优化手段。 八、Spring框架 1. Spring核心:依赖注入(DI)、AOP...

    Android应用源码之SundPoolSample-IT计算机-毕业设计.zip

    本篇将围绕“Android应用源码之SundPoolSample”进行详细的分析与探讨。 SundPoolSample是一款基于Android平台的应用示例,它的主要目标是展示如何有效地管理线程池,优化应用性能。线程池在多任务并行处理中扮演着...

    Java面试题.zip

    面试中会涉及线程的创建(Thread类和Runnable接口)、同步机制(synchronized,volatile,Lock),线程池(ExecutorService,ThreadPoolExecutor),以及死锁、活锁、饥饿等并发问题的分析和解决。 4. **网络编程**...

    精选:面试必备的java试题

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的求职竞争中脱颖而出,掌握好Java的基础知识并能应对面试中的各类问题至关重要。本资源"精选:面试必备的java试题"汇聚了各类...

    史上最全的java面试题

    - 线程池:ExecutorService接口和ThreadPoolExecutor类的使用。 4. **反射与注解** - 反射:通过Class类操作对象,动态加载类,调用私有方法等。 - 注解:了解元注解,自定义注解及其处理器。 5. **IO与NIO** ...

    最新java公司面试真实题目2023

    - 研究线程池的创建和使用,如Executors类和ThreadPoolExecutor。 5. **内存模型与垃圾回收** - 理解JVM内存结构,包括堆、栈、方法区等。 - 探讨对象的生命周期,以及何时会被垃圾回收。 - 分析垃圾回收算法,...

    JAVA求职面试1000问(65页)

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的求职竞争中脱颖而出,掌握全面的Java知识至关重要。这份"JAVA求职面试1000问(65页)"资料,无疑是准备Java面试者的宝典。...

    Java面试手册.zip

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在Java面试中脱颖而出,了解并掌握核心的Java基础知识、JVM(Java虚拟机)、Redis缓存技术、Java并发编程以及MySQL数据库知识至关...

    JavaGuide面试突击版(全).rar

    - 线程池:分析ExecutorService、ThreadPoolExecutor和ScheduledThreadPoolExecutor的构建与配置。 5. **并发编程** - 原子性:介绍AtomicInteger、AtomicLong等原子类及其在并发环境下的应用。 - volatile...

    java学习笔记源码MD.rar

    了解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)、垃圾收集机制等,能帮助开发者优化代码性能,解决内存泄漏等问题。 2. Spring框架: Spring是Java企业级应用开发中最常用的框架之一,它提供了...

    JAVA面试题总结

    - 探讨线程池(ExecutorService)的创建和管理,理解ThreadPoolExecutor类。 5. **IO流** - 深入理解字节流和字符流,以及装饰器模式在IO流中的应用。 - 掌握FileInputStream、FileOutputStream、BufferedReader...

    史上最全的Java面试题(含答案)

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在激烈的求职竞争中脱颖而出,全面掌握Java知识并能应对各种面试题至关重要。以下是对标题和描述中涉及的知识点的详细阐述: 一、...

    华为java培训内部资料

    Java编程语言是软件开发领域的主流语言之一,尤其在企业级应用中有着广泛的应用。华为作为全球知名的科技企业,对Java技术的掌握与运用有极高的要求。这份“华为java培训内部资料”旨在帮助开发者深入理解Java的核心...

    java程序员面试之葵花宝典.rar

    以上只是部分可能包含在"Java程序员面试之葵花宝典"中的知识点,实际文档可能还会涉及更多细节,如JPA、MyBatis、Maven、Git等工具的使用,单元测试、性能测试、代码优化等内容。通过深入学习和实践这些知识,Java...

    高并发编程实战1,2,3阶段

    - **线程池管理**:Executor框架、ThreadPoolExecutor类详解。 #### 第二阶段:高级技术与最佳实践 ##### 1. 锁优化技术 - **公平锁与非公平锁**:锁获取策略对比及应用场景分析。 - **自旋锁**:原理、优缺点及...

    Java爬虫技术,无视频,图文教程

    Java爬虫技术是一种在互联网上自动获取网页信息的程序,它是大数据时代的重要工具之一,尤其在数据分析、信息抓取和搜索引擎优化等领域具有广泛的应用。在这个无视频、图文教程中,我们将深入探讨Java语言如何用于...

    七周七并发高清版附送惊喜书籍

    另外,附赠的《企业应用架构模式》则是一部经典之作,它总结了在大型企业系统中广泛使用的架构模式,如事务脚本、领域模型、数据访问对象(DAO)等。这些模式可以帮助开发者设计出更稳定、可扩展和易于维护的系统。 ...

    Java各公司面试题

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。随着技术的不断发展,Java程序员的需求也在持续增长,而面试则是检验求职者技能的关键环节。本资源集合了多家公司的Java面试题,旨在帮助...

Global site tag (gtag.js) - Google Analytics