`
孤烟客
  • 浏览: 10070 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java并发之ThreadPoolExecutor分析

阅读更多

java并发之ThreadPoolExecutor分析

         ThreadPoolExecutor线程池是我们平时使用最多的线程池处理工具,充分理解线程池的实现原理,可以让我们在碰到相关问题时有效的进行参数调优与处理,进而提高程序的整体性能与吞吐量。本文依托于jdk1.8,但不会讨论代码的实现细节,需要注意的是ctl属性,ctl是把两个属性合并到一个int字段中进行记录,高3位记录线程池状态,低29位记录线程池数量。这样的做法仁者见仁智者见智,复杂性增加不说,性能到底能提升多少呢?大家在阅读的时候可以把int理解为长度为32的数组。

         “一个中心,两个基本点,我们在学生时代背诵了无数次的政治学内容,也同样适用于ThreadPoolExecutor。他的中心是以BlockingQueue为数据中心,以corePoolSize,与maximumPoolSize为两个基本点,只要我们充分理解了他们的作用,就抓住了了解ThreadPoolExecutor的钥匙。以下我将用图片的方式描述这几个字段的实际意义



 

 

简单解释一下上图的各个部分,整个大框代表了ThreadPoolExecutor类,我们可以把orePoolSize,与maximumPoolSize理解为两个阀值,在不同的阶段线程池表现的行为是有所不同的,poolSize是当前运行的线程池数量(ThreadPoolExecutor内部并不存在这个字段,这个字段存在于jdk1.6中,现在存在ctl29位之中),works存放当前的工作线程blockQueue存放我们的任务单元。假设现在线程池已初始化好了,并且内部状态如上图在等待我们的输入。这时我们执行了execute方法。那么

1,如果poolSize<corePoolSize,线程池会直接创建新线程进行任务执行,如图



 

 

poolsize指针上移,将新线程存储在works中,以便后来任务使用。

2如果poolSize>=corePoolSize,这时有两种情况,A如果blockqueue没有填满,直接将数据填入如队列中,如图



 

 

B,如果队列满了,则创建新线程进行任务任务执行,如图



 

 

这里需要解释一下,第二步实际上是该线程池最核心最精华的部分。在通常情况下,如果任务平稳的提交到线程池中,并且各个参数都设计的合理的话,线程池一直是以corePoolSize数量的线程在运行。所以corePoolSize值的设置大小很重要,同时要参考blockqueue的大小一起配置。corePoolSize太大会造成不必要的浪费,太小会造成线程池不断波动。 Blockqueue的大小也很重要,不建议不指定其大小,这样会使用int的最大值做初始化,当系统忙碌的时候会产生大量的任务积压,而且容易内存溢出,也把线程池的最后救命稻草拔掉了。上述是平稳的情况,如果有峰值情况怎么办,没关系,这时候maximumPoolSize开始起作用了,如上图,这里的关键是什么,就是新创建的线程不会立刻销毁,它会加入之前的线程池中,与大家一起消费blockqueue中的任务,系统中最坏的情况下可以创建maximumPoolSize个线程,大家同心协力一起挺过这个繁忙的时刻。这与我们在日常生活的情形一样,如果一下要完成太多的任务,项目组会马上会通过招人,从别的组调用等等措施,增加人手,提高整体战斗力。

3,如果poolSize>=maximumPoolSize,线程池已经达到最大负载了,这个时候怎么办,还有办法。如图



 

 

说实话,这时候线程池已经无能为力了,他搞不定了,他不搞的时候问题就抛给你了,这个时候你需要选择一种策略来应对这种情况,当然最常用的抛出异常,线程池到了这个程度已经基本快崩溃了。RejectedExecutionHandler是最后应急措施,当然这种情况要我们自己处理。

4,如果我们在3没有挺过来,估计已经宕机了,我们假设大家同心协力已经共度难关了。现在的问题是这么多线程该如何回收呢?管杀不管埋显然不是我们的风格。当blockqueue队列空并且poolSize>corePoolSize的时候,线程开始回收,直到只剩下corePoolSize个线程的时候为止。一切又恢复了最初,就好像什么都没发生过一样,英雄从来都是这样,逢乱世立马横尸,战乱结束,归田卸甲。

         至此,整个ThreadPoolExecutor讨论完了,核心思路就是不赶工的时候几个人慢慢干,一旦突然来大任务了,多找几个人干,干完了该滚蛋滚蛋。这时候可能有同学会问了,说了这么多,有没有我们自己表现的机会呢,也就是他有什么扩展点么?有的有的。比如ScheduledThreadPoolExecutor类,他的核心思路只是把blockqueue队列换成了根据时间先后排序的优先级队列,就完成了定时器调度工作。同时,我们也可以在我们的任务执行前后进行一些自定义处理,继承时只要实现beforeExecuteafterExecute接口即可。

  • 大小: 8.3 KB
  • 大小: 9.8 KB
  • 大小: 8.7 KB
  • 大小: 7.5 KB
  • 大小: 12.7 KB
0
3
分享到:
评论
2 楼 戢_时光 2015-08-03  
比如ScheduledThreadPoolExecutor类,他的核心思路只是把blockqueue队列换成了根据时间先后排序的优先级队列,就完成了定时器调度工作。

 
1 楼 05rjyzl11 2015-08-02  

相关推荐

    Java并发编程之ThreadPoolExecutor详解与实战

    内容概要:本篇文章深入探讨了Java中多线程管理的一个关键组件——ThreadPoolExecutor的工作机制及其优化策略。主要涵盖ThreadPoolExecutor的基础概念介绍,创建配置参数的意义与选择方法,以及在实际编程中的几种...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    《java 并发编程实战高清PDF版》

    在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...

    java 线程池例子ThreadPoolExecutor

    Java 线程池例子 ThreadPoolExecutor Java 中的线程池是指一个容器,里面包含了多个线程,这些线程可以重复使用,以避免频繁创建和销毁线程的开销。ThreadPoolExecutor 是 Java 中一个非常重要的线程池实现类,它...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    java并发编程内部分享PPT

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...

    java 并发编程的艺术pdf清晰完整版 源码

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    java并发编程与实践

    "Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...

    java并发编程书籍

    Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...

    Java 并发核心编程

    #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...

    ( Java并发程序设计教程.zip )高清版 PDF

    《Java并发程序设计教程》是一本深入探讨Java平台上的并发编程技术的专业书籍。并发和多线程是现代软件开发中的核心概念,特别是在Java这样的多线程支持强大的编程语言中。这本书详细介绍了如何在Java环境中有效地...

    13-Java并发编程学习宝典.zip

    Java并发编程是软件开发中的重要领域,特别是在大型系统和高并发场景中不可或缺。"13-Java并发编程学习宝典.zip" 包含了一系列关于Java并发编程的学习资源,旨在帮助开发者掌握多线程编程的核心技术和最佳实践。以下...

    Java并发编程设计原则和模式

    本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...

    JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf

    根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...

    java并发书籍xxxxxxx

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发能力可以极大地提高程序性能和响应速度。以下是一些关于Java并发编程的关键知识点: 1. **线程与进程**:在操作系统中,...

    java并发源码分析之实战编程

    "java并发源码分析之实战编程"这个主题深入探讨了Java平台上的并发处理机制,旨在帮助开发者理解并有效地利用这些机制来提高程序性能和可扩展性。在这个专题中,我们将围绕Java并发库、线程管理、锁机制、并发容器...

    Java并发程序设计教程

    本教程将深入探讨Java并发编程的核心概念、最佳实践以及常见陷阱。 首先,我们要了解Java中的线程。线程是操作系统分配CPU时间的基本单元,Java通过Thread类来抽象线程。创建线程有两种方式:继承Thread类并重写run...

    java并发编程实战.zip

    《Java并发编程实战》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境中构建高效、可靠的系统。以下是本书涉及的一些关键知识点: 1. *...

Global site tag (gtag.js) - Google Analytics