根据需要扩展java中的ThreadPoolExecutor
经常被重写的三个方法
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的更多相关文章
- Java中使用ThreadPoolExecutor并行执行独立的单线程任务
Java SE 5.0中引入了任务执行框架,这是简化多线程程序设计开发的一大进步.使用这个框架可以方便地管理任务:管理任务的生命周期以及执行策略. 在这篇文章中,我们通过一个简单的例子来展现这个框架所 ...
- java中ThrealLocal的理解
目录 java中threadlocal的理解 一.threadlocal的生命周期和ThreadLocalMap的生命周期 二.ThreadLocal的作用 三.threadlocal示例 四.Inh ...
- java中的线程(3):线程池类 ThreadPoolExecutor「线程池的类型、参数、扩展等」
官方文档: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html 1.简介 pu ...
- java中Executor、ExecutorService、ThreadPoolExecutor介绍(转)
1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /** * Executes th ...
- java中Executor、ExecutorService、ThreadPoolExecutor介绍
源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /** * Executes the given c ...
- 浅谈Java中的补零扩展和补符号位扩展
今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合. ...
- Java中常用类(包装类扩展知识)
Java常用类有哪些? 八大基本数据类型的包装类 包装类均位于java.lang包中,包装类和基本数据类型的对应关系如下表: 基本数据类型 包装类 byte Byte boolean Boolean ...
- java中 ExecutorService,Executor,ThreadPoolExecutor的用法
package com; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; import ...
- 第9章 Java中的线程池 第10章 Exector框架
与新建线程池相比线程池的优点 线程池的分类 ThreadPoolExector参数.执行过程.存储方式 阻塞队列 拒绝策略 10.1 Exector框架简介 10.1.1 Executor框架的两级调 ...
随机推荐
- Linux pwn入门教程(2)——shellcode的使用,原理与变形
作者:Tangerine@SAINTSEC 0×00 shellcode的使用 在上一篇文章中我们学习了怎么使用栈溢出劫持程序的执行流程.为了减少难度,演示和作业题程序里都带有很明显的后门.然而在现实 ...
- Testing - 软件测试知识梳理 - 相关词汇
测试策略 描述测试工程的总体方法和目标:根据测试需求,描述在什么测试阶,依据什么测试要素和目标,进行什么种类的测试,使用什么样的测试方法和工具. 测试策略的制定主要包含如下内容: 确定测试过程要使用的 ...
- Shell - 简明Shell入门
本文以示例和注释的方式,对Shell编程的基本知识点进行了总结和回顾,所有脚本均已做了基本的调试和验证. Shell - 简明Shell入门 01 - 第一个脚本 脚本的定义.执行方法以及echo命令 ...
- sublime text下安装插件autoprefixer
有时候在写css样式的时候,分不清哪些属性需要前缀,哪些不需要,总是爱搞混淆了,于是autoprefixer这款插件便应运而生了.虽然在使用webpack的时候,我们可以很方便的使用这个,但是,如果项 ...
- Spring Boot定制启动图案
启动图案 Spring Boot在启动的时候会显示一个默认的Spring的图案,对应的类为SpringBootBanner. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_) ...
- Spark基础脚本入门实践3:Pair RDD开发
Pair RDD转化操作 val rdd = sc.parallelize(List((1,2),(3,4),(3,6))) //reduceByKey,通过key来做合并val r1 = rdd.r ...
- Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成
写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原 ...
- postgresql-删除重复数据
greenplum最终的方法是: delete from test where (gp_segment_id, ctid) not in (select gp_segment_id, min(ct ...
- 批量插入bulkcopy
public static void InsertBatch<T>(IDbConnection conn, IEnumerable<T> entityList, string ...
- 前端进击的巨人(六):知否知否,须知this
常见this的误解 指向函数自身(源于this英文意思的误解) 指向函数的词法作用域(部分情况) this的应用环境 1. 全局环境 无论是否在严格模式下,全局执行环境中(任何函数体外部)this都指 ...