public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这个构造函数 中 最后这个参数 RejectedExecutionHandler handler: 线程池对拒绝任务的处理策略;
详细点说:当 Executor 已经关闭,并且 Executor 将有限边界用于最大线程和工作队列容量,且已经饱和时,在方法 execute(java.lang.Runnable) 中提交的新任务将被拒绝。在以上两种情况下,execute 方法都将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法
一般都是直接用的new ThreadPoolExecutor.DiscardOldestPolicy()作为最后一个参数。
一般常用的handler 有四种预定义的处理程序策略:
A. 在默认的 ThreadPoolExecutor.AbortPolicy 中,处理程序遭到拒绝将抛出运行时 RejectedExecutionException 。
B. 在 ThreadPoolExecutor.CallerRunsPolicy 中,线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
C. 在 ThreadPoolExecutor.DiscardPolicy 中,不能执行的任务将被删除。
D. 在 ThreadPoolExecutor.DiscardOldestPolicy 中,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。
定义和使用其他种类的 RejectedExecutionHandler 类也是可能的,但这样做需要非常小心,尤其是当策略仅用于特定容量或排队策略时。追问不知道 你用过这个线程池没?我想请教下里面所说的被拒绝的任务是什么意思?什么情况下任务被拒绝?那如果用了 DiscardOldestPolicy()那么 之前最老的任务没有执行完也会被删除吗?
回答上面已经说过啊,通俗点说两种情况算拒绝:
1 线程池已关闭;
2 线程池已饱和(处于最大线程和工作队列容量)时在以上两种情况下,在方法 execute(java.lang.Runnable) 中提交的新任务将被拒绝。
execute 方法都将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这个构造函数 中 最后这个参数 RejectedExecutionHandler handler: 线程池对拒绝任务的处理策略;
详细点说:当 Executor 已经关闭,并且 Executor 将有限边界用于最大线程和工作队列容量,且已经饱和时,在方法 execute(java.lang.Runnable) 中提交的新任务将被拒绝。在以上两种情况下,execute 方法都将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法
一般都是直接用的new ThreadPoolExecutor.DiscardOldestPolicy()作为最后一个参数。
一般常用的handler 有四种预定义的处理程序策略:
A. 在默认的 ThreadPoolExecutor.AbortPolicy 中,处理程序遭到拒绝将抛出运行时 RejectedExecutionException 。
B. 在 ThreadPoolExecutor.CallerRunsPolicy 中,线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
C. 在 ThreadPoolExecutor.DiscardPolicy 中,不能执行的任务将被删除。
D. 在 ThreadPoolExecutor.DiscardOldestPolicy 中,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。
定义和使用其他种类的 RejectedExecutionHandler 类也是可能的,但这样做需要非常小心,尤其是当策略仅用于特定容量或排队策略时。追问不知道 你用过这个线程池没?我想请教下里面所说的被拒绝的任务是什么意思?什么情况下任务被拒绝?那如果用了 DiscardOldestPolicy()那么 之前最老的任务没有执行完也会被删除吗?
回答上面已经说过啊,通俗点说两种情况算拒绝:
1 线程池已关闭;
2 线程池已饱和(处于最大线程和工作队列容量)时在以上两种情况下,在方法 execute(java.lang.Runnable) 中提交的新任务将被拒绝。
execute 方法都将调用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法