【发布时间】:2015-10-22 12:19:47
【问题描述】:
我正在阅读Java Concurrency in Practice,对下面关于ThreadPoolExecutor的说法感到困惑:
工作时没有预定义的饱和策略使执行阻塞 队列已满。
不过,作者也将abort 称为默认策略。
那么这里有什么问题?
【问题讨论】:
我正在阅读Java Concurrency in Practice,对下面关于ThreadPoolExecutor的说法感到困惑:
工作时没有预定义的饱和策略使执行阻塞 队列已满。
不过,作者也将abort 称为默认策略。
那么这里有什么问题?
【问题讨论】:
如 java 文档中所述:
在方法execute(Runnable)中提交的新任务将被拒绝 Executor 已经关闭,并且当 Executor 使用 最大线程和工作队列容量的有限界限,并且是 饱和。在任何一种情况下,execute 方法都会调用 RejectedExecutionHandler.rejectedExecution(可运行, ThreadPoolExecutor) 方法的 RejectedExecutionHandler。
还有 4 种不同的预定义处理程序:
所以默认使用 AbordPolicy。
可以定义和使用其他类型的 RejectedExecutionHandler 类。这样做需要一些小心 特别是当政策被设计为仅在特定条件下起作用时 容量或排队政策。
从 ThreadPoolExecutor 源代码中提取:
/**
* The default rejected execution handler
*/
private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
正如@Jiri Tousek 所说,所有这些默认行为都会阻止调用者。
【讨论】: