TaskRejectedException抛出并且线程池未满

时间:2019-06-25 02:39:04

标签: java spring threadpool threadpoolexecutor

我使用spring线程池来管理项目中的线程。 但是,当我的代码运行时,出现了一些错误。 我收到类似这样的异常:

org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@4cfc01ab[Running, pool size = 200, active threads = 0, queued tasks = 40, completed tasks = 7990]] did not accept task: java.util.concurrent.FutureTask@6ba9fcd5

当池“活动线程”为零时,它抛出TaskRejectedException

我已经阅读了Spring的文档和源代码,但一无所获。

我的TaskExecutor类:

@Bean
public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setKeepAliveSeconds(200);
    taskExecutor.setCorePoolSize(200);
    taskExecutor.setMaxPoolSize(200);
    taskExecutor.setQueueCapacity(40);
    taskExecutor.setRejectedExecutionHandler(new 
    ThreadPoolExecutor.AbortPolicy());
    return taskExecutor;
}

active threads有时是0,有时是10,从不怪异200。

1 个答案:

答案 0 :(得分:0)

在异常消息中,它具有“排队的任务= 40”。由于在您的设置中您具有setQueueCapacity(40),因此当排队的任务已经为40时执行线程将抛出该异常。

如果您要快速提交任务,我会尝试增加队列容量。线程不会立即从队列移到活动状态,尤其是在JVM繁忙时。

就活动线程数而言,这只是一个近似值。 ThreadPoolExecutor.getActiveThreadCount的Java文档:

/**
 * Returns the approximate number of threads that are actively
 * executing tasks.
 *
 * @return the number of threads
 */
public int getActiveCount() {