经常被重写的三个方法

ThreadPoolExecutor是可扩展的,通过查看源码可以发现,它提供了几个可以在子类化中改写的方法:beforeExecute,afterExecute,terminated.

protected void beforeExecute(Thread t, Runnable r) { }
protected void afterExecute(Runnable r, Throwable t) { }
protected void terminated() { }

在执行任务的线程中将调用beforeExecute和afterExecute等方法,在这些方法中还可以添加日志、计时、监视或者统计信息收集的功能。

无论任务是从run中正常返回,还是抛出一个异常而返回,afterExecute都会被调用。

如果任务在完成后带有一个Error,那么就不会调用afterExecute。

如果beforeExecute抛出一个RuntimeException,那么任务将不被执行,并且afterExecute也不会被调用。

在线程池完成关闭时调用terminated,也就是在所有任务都已经完成并且所有工作者线程也已经关闭后,terminated可以用来释放Executor在其生命周期里分配的各种资源,此外还可以执行发送通知、记录日志或者手机finalize统计等操作。

更改ThreadPoolExecutor的执行流程

正常情况下的,threadPoolExecutor的执行流程是:

1、线程数量低于core_size,不断的创建新的线程;
2、core_size已达到,将任务扔到队列里面;
3、core_size已达到,队列已经满了(插入任务失败),开始创建新线程;
4、线程数到max_size后,如果队列还是满的,抛出 RejectedExecutionException

这种执行过程,存在一个弊端:

1、当前线程数,超过core_size,会立刻将任务添加到队列中。如果队列设置的非常长,任务又很多的情况下,将会有频繁的任务入队和出队的操作。这种操作也是有一定资源及性能消耗的(理论上,作者未进行真机验证,网上有网友也指出过这个问题)。

2、线程数只有将 core_size和队列数量 占满的情况下,才启用新的线程(一直开到最大数量)。如果机器性能好,而core_size值设的小,会有资源浪费。

网上有人提出,设置新的执行流程:

1、未满core_size,不创建新的线程;
2、未满max,且core_size无空闲,创建新线程;
3、达到max,且全部无空闲,将任务丢进队列
4、达到max,且达到队列数,再抛出 RejectedExecutionException

这种也存在一种问题:

如果 core_size 远小于 max_size,则会大量创建新线程。(理论上,上线前的压测会有所改动)。

不过,如果项目存在瞬时大流出量,这种流程,则是一种不错的处理方案。

流程实现代码:https://github.com/li-shaoke/ExpandThreadPool

参考自:

http://blog.sina.com.cn/s/blog_6145ed8101015xfg.html

http://blog.csdn.net/linsongbin1/article/details/78275283

根据需要扩展java中的ThreadPoolExecutor的更多相关文章

  1. Java中使用ThreadPoolExecutor并行执行独立的单线程任务

    Java SE 5.0中引入了任务执行框架,这是简化多线程程序设计开发的一大进步.使用这个框架可以方便地管理任务:管理任务的生命周期以及执行策略. 在这篇文章中,我们通过一个简单的例子来展现这个框架所 ...

  2. java中ThrealLocal的理解

    目录 java中threadlocal的理解 一.threadlocal的生命周期和ThreadLocalMap的生命周期 二.ThreadLocal的作用 三.threadlocal示例 四.Inh ...

  3. java中的线程(3):线程池类 ThreadPoolExecutor「线程池的类型、参数、扩展等」

    官方文档: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html 1.简介 pu ...

  4. java中Executor、ExecutorService、ThreadPoolExecutor介绍(转)

    1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /**     * Executes th ...

  5. java中Executor、ExecutorService、ThreadPoolExecutor介绍

    源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /**      * Executes the given c ...

  6. 浅谈Java中的补零扩展和补符号位扩展

    今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合. ...

  7. Java中常用类(包装类扩展知识)

    Java常用类有哪些? 八大基本数据类型的包装类 包装类均位于java.lang包中,包装类和基本数据类型的对应关系如下表: 基本数据类型 包装类 byte Byte boolean Boolean ...

  8. java中 ExecutorService,Executor,ThreadPoolExecutor的用法

    package com; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; import ...

  9. 第9章 Java中的线程池 第10章 Exector框架

    与新建线程池相比线程池的优点 线程池的分类 ThreadPoolExector参数.执行过程.存储方式 阻塞队列 拒绝策略 10.1 Exector框架简介 10.1.1 Executor框架的两级调 ...

随机推荐

  1. 闲话ajax,例ajax轮询,ajax上传文件[开发篇]

    引语:ajax这门技术早已见怪不怪了,我本人也只是就自己真实的经验去总结一些不足道的话.供不是特别了解的朋友参考参考! 本来早就想写一篇关于ajax的文章的,但是前段时间一直很忙,就搁置了,趁着元旦放 ...

  2. Facebook的一些基本操作(网页版)

    前期准备 1,注册一次Facebook账号,新建一个应用取到应用id 2,引进Facebook的SDK到页面中: 在js中引进以下代码,初始化 // facebook window.fbAsyncIn ...

  3. Spring Boot定制启动图案

    启动图案 Spring Boot在启动的时候会显示一个默认的Spring的图案,对应的类为SpringBootBanner. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_) ...

  4. PHP-----浅谈垃圾回收机制

    前言 大多数编程语言都会有自身的垃圾回收机制,php也不例外.经常听很多人说gc,也就是垃圾回收器,全程为Garbage Collection. 在php5.3之前,是不包括垃圾回收机制的,也没有专门 ...

  5. ZooKeeper和Curator相关经验总结

    一.关于ZooKeeper的watch用法,需要注意 详细说明如下: ZooKeeper Watches All of the read operations in ZooKeeper - getDa ...

  6. SpringBoot之oauth2.0学习之服务端配置快速上手

    现在第三方登录的例子数见不鲜.其实在这种示例当中,oauth2.0是使用比较多的一种授权登录的标准.oauth2.0也是从oauth1.0升级过来的.那么关于oauth2.0相关的概念及其原理,大家可 ...

  7. redis 五种数据类型

    前言 前面学会了单机, 学会了集群, 但是redis咋用啊? 或者说, redis支持哪些数据类型呢? 常用的有五种: String , Hash, List, Set, zset(SortedSet ...

  8. IceCTF 图片隐写

    blue monday 下载一个文件,知道是MIDI文件,后缀改为.mid可以直接播放 一开始以为是两种乐器构成摩斯密码,后来在winhex里看字符发现了每一段的第一个字母恰好有flag的形式,于是提 ...

  9. JavaWeb学习(二十二)———EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

  10. 再会,OI

    现在时间是一八年的七月二十一日下午,NOI2018 闭幕式已经结束.嗯,结束了... 谢绝了李总的好意也没有让父母来接,有段路还是要自己一个人走的... 总结一下 NOI ...其实也没有什么好总结的 ...