Вызов TaskRejectedException и пул потоков не заполнен - PullRequest
0 голосов
/ 25 июня 2019

Я использую Spring Thread Pool для управления потоками в моем проекте.Но что-то не так, когда мой код работает.Я получаю исключения, такие как:

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 голосов
/ 26 июня 2019

В сообщении об исключении указывается "поставленные в очередь задачи = 40". Поскольку в вашей настройке у вас есть setQueueCapacity (40), выполнение потока, когда задачи в очереди уже на 40, вызовет это исключение.

Если вы отправляете задания очень быстро, я бы попытался увеличить емкость очереди. Потоки не сразу переходят из очереди в активную, особенно когда JVM занята.

Что касается количества активных потоков, это только приблизительное значение. Документ Java для ThreadPoolExecutor.getActiveThreadCount:

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