线程池(java.util.concurrent.ThreadPoolExecutor)的使用(二)
来源:互联网 发布:mac电脑怎么长截图 编辑:程序博客网 时间:2024/05/21 02:37
当 Executor 已经关闭,并且 Executor 将有限边界用于最大线程和工作队列容量,且已经饱和时,在方法 execute(java.lang.Runnable) 中提交的新任务将被拒绝。在以上两种情况下,execute 方法都将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法。下面提供了四种预定义的处理程序策略:
A. 在默认的 ThreadPoolExecutor.AbortPolicy 中,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。
B. 在 ThreadPoolExecutor.CallerRunsPolicy 中,线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
C. 在 ThreadPoolExecutor.DiscardPolicy 中,不能执行的任务将被删除。
D. 在 ThreadPoolExecutor.DiscardOldestPolicy 中,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。
定义和使用其他种类的 RejectedExecutionHandler 类也是可能的,但这样做需要非常小心,尤其是当策略仅用于特定容量或排队策略时。
挂钩方法
此类提供 protected 可重写的 beforeExecute(java.lang.Thread, java.lang.Runnable) 和 afterExecute(java.lang.Runnable, java.lang.Throwable) 方法,这两种方法分别在执行每个任务之前和之后调用。它们可用于操纵执行环境;例如,重新初始化 ThreadLocal、搜集统计信息或添加日志条目。此外,还可以重写方法 terminated() 来执行 Executor 完全终止后需要完成的所有特殊处理。
如果挂钩或回调方法抛出异常,则内部辅助线程将依次失败并突然终止。
队列维护
方法 getQueue() 允许出于监控和调试目的而访问工作队列。强烈反对出于其他任何目的而使用此方法。remove(java.lang.Runnable) 和 purge() 这两种方法可用于在取消大量已排队任务时帮助进行存储回收。
一、例子
创建 TestThreadPool 类:
创建 ThreadPoolTask类:
执行结果:
创建任务并提交到线程池中:task@ 1
开始执行任务:task@ 1
创建任务并提交到线程池中:task@ 2
开始执行任务:task@ 2
创建任务并提交到线程池中:task@ 3
创建任务并提交到线程池中:task@ 4
开始执行任务:task@ 3
创建任务并提交到线程池中:task@ 5
开始执行任务:task@ 4
创建任务并提交到线程池中:task@ 6
创建任务并提交到线程池中:task@ 7
创建任务并提交到线程池中:task@ 8
开始执行任务:task@ 5
开始执行任务:task@ 6
创建任务并提交到线程池中:task@ 9
开始执行任务:task@ 7
创建任务并提交到线程池中:task@ 10
开始执行任务:task@ 8
开始执行任务:task@ 9
开始执行任务:task@ 10
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(二)
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(二)
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(一)
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(一)
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(一)
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(一)
- JDK5 线程池(java.util.concurrent.ThreadPoolExecutor) 使用介绍
- 线程池java.util.concurrent.ThreadPoolExecutor总结
- 线程池java.util.concurrent.ThreadPoolExecutor总结
- 线程池java.util.concurrent.ThreadPoolExecutor总结
- 线程池java.util.concurrent.ThreadPoolExecutor总结
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介,线程邮件发送实例
- 线程池类为 java.util.concurrent.ThreadPoolExecutor
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor
- 线程池ThreadPoolExecutor与java.util.concurrent.RejectedExecutionException异常
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
- vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
- Nginx 0.7.x + PHP 5.2.8(FastCGI)搭建胜过Apache十倍的Web服务器(第4版)
- C#设计的一个向导程序(Wizard)框架
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(一)
- 线程池(java.util.concurrent.ThreadPoolExecutor)的使用(二)
- 我要赚积分
- 如何得到文件夹下所有的子文件夹名称
- MS-DOS 学习总结
- 程序员面试英语
- Sandy引擎学习笔记:导入3ds模型纹理
- spring 的jar包详解
- 04/01/09
- 初涉反射