我正在阅读 Java Concurrency in Practice ,并对有关ThreadPoolExecutor的声明感到困惑,如下所示:
在工作时没有预定义的饱和策略来执行阻塞 队列已满。
但是,作者还将abort
称为默认策略。
所以这里有什么不对?
答案 0 :(得分:1)
如java doc中所述:
方法execute(Runnable)中提交的新任务将被拒绝 Executor已经关闭,Executor也使用了 最大线程和工作队列容量的有限界限,和 饱和即可。在任何一种情况下,execute方法都会调用 RejectedExecutionHandler.rejectedExecution(Runnable接口, 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所说,所有这些默认行为都会阻止调用者。