`
xiaofengxbf
  • 浏览: 18326 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ThreadPoolExecutor使用情况

    博客分类:
  • java
 
阅读更多

整个ThreadPoolExecutor的任务处理有4步操作:

 

  • 第一步,初始的poolSize < corePoolSize,提交的runnable任务,会直接做为new一个Thread的参数,立马执行
  • 第二步,当提交的任务数超过了corePoolSize,就进入了第二步操作。会将当前的runable提交到一个block queue中
  • 第三步,如果block queue是个有界队列,当队列满了之后就进入了第三步。如果poolSize < maximumPoolsize时,会尝试new 一个Thread的进行救急处理,立马执行对应的runnable任务
  • 第四步,如果第三步救急方案也无法处理了,就会走到第四步执行reject操作。
几点说明:(相信这些网上一搜一大把,我这里简单介绍下,为后面做一下铺垫)
  • block queue有以下几种实现:
    1. ArrayBlockingQueue :  有界的数组队列
    2. LinkedBlockingQueue : 可支持有界/无界的队列,使用链表实现
    3. PriorityBlockingQueue : 优先队列,可以针对任务排序
    4. SynchronousQueue : 队列长度为1的队列,和Array有点区别就是:client thread提交到block queue会是一个阻塞过程,直到有一个worker thread连接上来poll task。
  • RejectExecutionHandler是针对任务无法处理时的一些自保护处理:
  • 容易被人忽略的点:
    1.  pool threads启动后,以后的任务获取都会通过block queue中,获取堆积的runnable task.
     
    所以建议: block size >= corePoolSize ,不然线程池就没任何意义
    2.  corePoolSize 和 maximumPoolSize的区别, 和大家正常理解的数据库连接池不太一样。
      *  据dbcp pool为例,会有minIdle , maxActive配置。minIdle代表是常驻内存中的threads数量,maxActive代表是工作的最大线程数。
      *  这里的corePoolSize就是连接池的maxActive的概念,它没有minIdle的概念(每个线程可以设置keepAliveTime,超 过多少时间多有任务后销毁线程,默认只会针对maximumPoolSize参数的线程生效,可以设置 allowCoreThreadTimeOut=true,就可以对corePoolSize进行idle回收)。 
      * 这里的maximumPoolSize,是一种救急措施的第一层。当threadPoolExecutor的工作threads存在满负荷,并且 block queue队列也满了,这时代表接近崩溃边缘。这时允许临时起一批threads,用来处理runnable,处理完后通过keepAliveTime进 行调度回收。
     
    所以建议:  maximumPoolSize >= corePoolSize =期望的最大线程数。 (我曾经配置了corePoolSize=1, maximumPoolSize=20, blockqueue为无界队列,最后就成了单线程工作的pool。典型的配置错误)
     
    3. 善用blockqueue和reject组合. 这里要重点推荐下CallsRun的Rejected Handler,从字面意思就是让调用者自己来运行。
    我们经常会在线上使用一些线程池做异步处理,比如我前面做的(业务层)异步并行加载技术分析和设计将 原本串行的请求都变为了并行操作,但过多的并行会增加系统的负载(比如软中断,上下文切换)。所以肯定需要对线程池做一个size限制。但是为了引入异步 操作后,避免因在block queue的等待时间过长,所以需要在队列满的时,执行一个callsRun的策略,并行的操作又转为一个串行处理,这样就可以保证尽量少的延迟影响。
     
    所以建议: RejectExecutionHandler = CallsRun ,  blockqueue size = 2 * poolSize (为啥是2倍poolSize,主要一个考虑就是瞬间高峰处理,允许一个thread等待一个runnable任务)

  • 1. Reject 直接抛出Reject exception
    2. Discard 直接忽略该runnable,不可取
    3. DiscardOldest 丢弃最早入队列的的任务
    4. CallsRun 直接让原先的client thread做为worker线程,进行执行
分享到:
评论

相关推荐

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    (线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式) 多选 3.下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态...

    lasync:使执行程序服务更困难

    如果使用常规的则ThreadPoolExecutor调用不会阻塞的队列的“ ”方法:插入任务并返回true,或者在队列“容量受限”且达到其容量的情况下返回false。 尽管此行为很有用,但在某些情况下,我们确实需要阻止并等待,...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    11.3.1 ThreadPoolExecutor 407 11.3.2 线程池的分类 410 第12章 Bitmap的加载和Cache 413 12.1 Bitmap的高效加载 414 12.2 Android中的缓存策略 417 12.2.1 LruCache 418 12.2.2 DiskLruCache 419 12.2.3 ...

    Android AsyncTask 完美解析 看不懂源码你就输了

    理想情况下,应将AsyncTasks用于短操作(最多几秒钟)。如果需要长时间保持线程运行,建议使用 java.util.concurrent 包提供的各种API。 例如{@link Executor},{@ link ThreadPoolExecutor}和{@link FutureTask}。 ...

    Android开发艺术探索

     11.3.1 ThreadPoolExecutor / 407  11.3.2 线程池的分类 / 410  第12章 Bitmap的加载和Cache / 413  12.1 Bitmap的高效加载 / 414  12.2 Android中的缓存策略 / 417  12.2.1 LruCache / 418  12.2.2 ...

    java线程池概念.txt

    默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用;即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过...

    Java并发编程(学习笔记).xmind

    (4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个事件分发线程(类似于中断响应函数)来替代主事件循环,当用户界面用有事件发生时,在事件线程中将调用对应的事件处理函数(类似于中断处理函数) ...

    java对大数据的处理.pdf

    //建⽴⼀个线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( minTaskNumber, maxTaskNumber, 3L, TimeUnit.SECONDS, new ArrayBlockingQueue(minTaskNumber), new ThreadPoolExecutor....

    site-monitor:监控网站的可访问性的监控系统

    使用ThreadPoolExecutor作为并发检测, 在这个基础上加入了超时检测,避免线程卡主. 演示 首页 展示了http、tcp、ping这三种任务数量. 以及不同监控频率任务分布. 监测点管理 任务列表 任务结果 任务监测点快照 部署 ...

    百度地图开发java源码-blog-backup:学习文章,也是我博客的备份

    删除链表中重复的节点[无序的情况下-HashSet] 二. Notes for Android Heros 三. Notes for Arts of Android Dev 本章介绍 View 的基本概念和 View 的滑动相关知识以及关于 View 的事件分发机制实例和源码解析。 本篇...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高并发编程第二阶段44讲、被动引用和类加载过程的练习巩固训练题.mp4 │ 高并发编程第二阶段45讲、ClassLoader加载阶段发生的...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高并发编程第二阶段44讲、被动引用和类加载过程的练习巩固训练题.mp4 │ 高并发编程第二阶段45讲、ClassLoader加载阶段发生的...

    关于ThreadPool抛出OOM问题

    最近在学习Java调优,有个案例是ThraadPool导致OOM,在不了解线程池的情况很难看出问题来。 代码片. package com.example.demo; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent....

Global site tag (gtag.js) - Google Analytics