关于ThreadPoolExecutor
来源:互联网 发布:js input自动获取焦点 编辑:程序博客网 时间:2024/05/22 16:56
ThreadPoolExcutor为一些Executor提供了基本的实现,ThreadPoolExecutor是一个灵活的健壮的池实现,允许各种各样的用户定制。
以下是此线程池的常用构造方法
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler)
如:ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 5, 1,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
相关参数介绍如下:
corePoolSize 线程池维护的核心线程数,也是初始线程数。
maximumPoolSize线程池维护的最大线程数。 当程序中所需线程超过初始线程时,并且线程队列已满时,线程池能增加到的最大线程数。
keepAliveTime空闲线程结束的超时时间,线程池中如果存在大于初始线程的的空闲线程,在此时间内未有新的执行任务,则会直接释放此线程。
unit是一个枚举,表示 keepAliveTime 的单位。 可选值如下:
workQueue表示存放任务的队列。
handler 线程池任务处理的拒绝策略。
其他参数基本如上介绍,下面着重介绍下workQueue和handler参数。
workQueue
当任务数超过核心线程数时,多余的任务会存储在消息队列中,若队列已满,则会创建新线程,但不会超过最大线程数。
ArrayBlockingQueue<Runnable>(capacity)
此队列为有界容量的对列,容量大小即为capacity,当消息很巨大时,能规避资源被耗尽的风险。
LinkedBlockingQueue<Runnable>()
此队列有多个重载方法,可以设置容量大小,如果不设置则是无界的,当不能确定消息容量时,可以使用此消息队列来存储消息。
SynchronousQueue<Runnable>()
此种工作队列绕开了消息队列,当任务来临时直接创建工作线程,此时需要将 maximumPoolSize设置为无限大的值(Integer.MAX_VALUE),来确保所有消息都能执行,此时需要注意资源的监控,防止资源过分占用,影响其他应用的进行。
PriorityBlockingQueue<Runnable>()
handler
当任务数已到达线程池所要求的最大线程数,此刻还有其他任务需要进行,这时就需要调用任务拒绝策略,来对任务进行拒绝操作。以下以一个例子说明
private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 2, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), new ThreadPoolExecutor.CallerRunsPolicy()); private static volatile int i = 0; public static void main(String[] args) { for (i = 1; i < 20; i++) { System.out.println(i); threadPool.execute(new Runnable() { @Override public void run() { System.out.println("任务执行中===" + i); } }); } threadPool.shutdown(); while (true) { if (threadPool.isTerminated()) { break; } try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } }ThreadPoolExecutor.AbortPolicy :为默认的拒绝处理策略,超过最大线程数处理程序遭到拒绝将抛出RejectedExecutionException运行时异常。可以看出只能执行部分任务。
ThreadPoolExecutor.CallerRunsPolicy :线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度,但任务都能执行完毕。
ThreadPoolExecutor.DiscardPolicy :不能执行的任务将被删除。可以看出只能执行部分任务。
ThreadPoolExecutor.DiscardOldestPolicy :如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。可以看出只能执行部分任务。
这是在有界ArrayBlockingQueue<Runnable>(2)的情况下执行的四种不同拒绝策略的结果。其他消息队列的情况请自行验证。
另外,不建议使用ExecutorService创建线程池,此线程池有耗尽资源的风险。
阅读全文
0 0
- 关于ThreadPoolExecutor
- 关于ThreadPoolExecutor使用介绍
- 关于ThreadPoolExecutor的解析
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- ThreadPoolExecutor
- 2017年11月应聘感悟
- Android 获取jks签名信息
- 例子---JS无缝轮播图
- 20171031
- 【个人模板】 高精度BigInt
- 关于ThreadPoolExecutor
- 利用ECharts3来实现ECharts2实例中的模拟迁徙效果,即背景地图为百度地图。 标签: ECharts3Echarts2模拟迁徙百度地图引入
- 【清北学堂济南刷题班】仓库
- 第一天linux
- 判断一个字符串是否为另外一个字符串旋转之后的字符串。
- linux命令:tcpdump
- 浏览器渲染过程
- Leetcode:171. Excel Sheet Column Number 求Excel表字母对应的行号
- 四种mysql存储引擎