java - 抛出 TaskRejectedException 且线程池未满

标签 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

当池“Activity 线程”为零时,它会抛出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;
}

Activity 线程 有时是 0 有时是 10 ,从来没有 200 ,很奇怪。

最佳答案

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

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

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

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

关于java - 抛出 TaskRejectedException 且线程池未满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56746132/

相关文章:

java - Class 的 getClassLoader() 什么时候抛出 SecurityException

java - Infinispan相当于ehcache的copyOnRead和copyOnWrite

java - 创建自定义查询方法时在 JPA 中创建查询异常

java - 在文件被删除之前收到通知

java - 使用 spring 和 hibernate 测试数据库连接

java - ExtJS4、Spring JPA、Restful 服务、Hibernate 应用程序

c++ - IO 完成端口与线程池 API

java - @Value 和 @PropertySource ("classpath:application.properties")始终返回 null

python - 每次迭代在多个 CPU 上训练不同的 scikit-learn 分类器

java - 使用 ThreadPoolExecutor 缩放 maxPoolSize;为什么池不会动态增加其大小?