标签:
在 Java 的 ThreadPoolExecutor
中,当达到线程数量上限并且工作队列也已满时,有以下几种处理策略:
-
ThreadPoolExecutor.AbortPolicy
(默认):当工作队列和线程池都已满时,新提交的任务会抛出RejectedExecutionException
异常,阻止任务继续提交。 -
ThreadPoolExecutor.CallerRunsPolicy
:当工作队列和线程池都已满时,新提交的任务会由提交任务的线程执行(由调用线程来执行),即主线程会参与执行任务,以避免任务被丢弃。这种策略可以用作简单的反压机制。 -
ThreadPoolExecutor.DiscardPolicy
:当工作队列和线程池都已满时,新提交的任务会被默默地丢弃,不会抛出异常也不会执行任务。 -
ThreadPoolExecutor.DiscardOldestPolicy
:当工作队列已满时,会丢弃工作队列最前面(即等待时间最长)的一个任务,并尝试再次提交当前任务。
除了以上策略外,也可以通过实现 RejectedExecutionHandler
接口来自定义拒绝策略。这个接口只有一个方法 rejectedExecution(Runnable r, ThreadPoolExecutor executor)
,通过实现这个方法来定制自己的拒绝策略。
例如,以下示例代码展示了一种自定义的拒绝策略:
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 在任务被拒绝时执行自定义的处理逻辑
// 可以将任务加入到其他队列中等待处理,或者记录日志等
// 或者抛出自定义异常
}
}
Java
然后,在创建 ThreadPoolExecutor
时,可以使用自定义的拒绝策略:
RejectedExecutionHandler customHandler = new CustomRejectedExecutionHandler();
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, customHandler);
标签: 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。