Как corePoolSize = 0 работает для ThreadPoolExecutor? - PullRequest
0 голосов
/ 01 сентября 2018

Определение для ExecutorService.newCachedThreadPool() равно

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>(),
                                  threadFactory);
}

Создается пул с corePoolSize = 0, maximumPoolSize = Integer.MAX_VALUE и неограниченной очередью.

Однако в документе для ThreadPoolExecutor написано:

Когда новая задача отправляется в метод execute (java.lang.Runnable) и выполняется меньше потоков corePoolSize, создается новый поток для обработки запроса, даже если другие рабочие потоки простаивают. Если запущено больше потоков corePoolSize, но меньше MaximumPoolSize, новый поток будет создан, только если очередь заполнена .

Так как же corePoolSize = 0 работает в этом случае? Первоначально, есть нить 0, так что, хотя в документации не сказано, я предполагаю, что она создаст новую нить для первой отправленной задачи. Но теперь, теперь, когда у нас есть 1 поток> corePoolSize = 0 и 1 поток

1 Ответ

0 голосов
/ 01 сентября 2018

так что никакой новой темы не будет создано, и мы застряли с 1 потоком?

Не совсем.

Обратите внимание, newCachedThreadPool использует SynchronousQueue:

Очередь блокировки, в которой каждая операция вставки должна ожидать соответствующая операция удаления другим потоком, и наоборот. синхронная очередь не имеет внутренней емкости, даже вместимость одного.

Это значит

  • если существует неработающий рабочий поток, пытающийся получить задание для очереди, задание будет успешно помещено в очередь и немедленно занято этим незанятым потоком и выполнено.

  • в противном случае эта задача не может быть помещена в очередь, другими словами, очередь заполнена. Затем будет создан новый поток для выполнения задачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...