@Override
public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) {
if (executor.isShutdown()) {
LOGGER.error("ThreadPool is shutdown, Task: {} has been rejected!", runnable);
throw new RejectedExecutionException(runnable.toString() + " rejected from: " + executor.toString());
} else {
while (!executor.getQueue().isEmpty()) {
LOGGER.warn("ThreadPool queue is not empty: {}", executor);
try {
Thread.sleep(100L);
} catch (InterruptedException var4) {
LOGGER.error("InterruptedException: ", var4);
}
executor.execute(runnable);
}
}
}
方法签名:
public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor)
注解:
@Override
:表示该方法覆盖了父类中的方法。
核心逻辑:
-
首先检查线程池是否处于关闭状态(
executor.isShutdown()
)。- 如果是,记录错误日志并抛出
RejectedExecutionException
异常,指明任务因线程池关闭而被拒绝。
- 如果是,记录错误日志并抛出
-
如果线程池未关闭,执行以下循环:
- 使用
while
循环检查线程池队列是否为空(executor.getQueue().isEmpty()
)。 - 如果队列不为空,记录警告日志,显示线程池的状态。
- 使用
-
在循环中,尝试让当前线程休眠100毫秒(
Thread.sleep(100L)
):- 如果线程在休眠期间被中断,捕获
InterruptedException
并记录错误日志。
- 如果线程在休眠期间被中断,捕获
-
如果队列不为空,尝试再次将任务添加到线程池中执行(
executor.execute(runnable)
)。
异常处理:
- 在捕获
InterruptedException
时,记录错误日志并继续执行循环。
日志记录:
- 使用
LOGGER
记录错误和警告级别的日志,提供有关线程池状态和中断信息的详细信息。
这个方法是线程池拒绝执行任务时的处理逻辑,通常用于实现自定义的拒绝策略。在默认情况下,如果线程池关闭或者任务无法提交到工作队列,任务可能会被拒绝。通过自定义RejectedExecutionHandler
,可以控制任务被拒绝时的行为,例如重试提交任务或者记录日志等。