@aarifkhamdi

Как освободить ThreadPool, если поток ожидает ресурс, а другой поток может выполняться?

Значит создаю ThreadPool: executor = Executors.newFixedThreadPool(8);.
Отправляю в него задачи:
executor.submit(work);
Много задач...
Пусть я отправил туда 10 задач. 8 первых ожидают ресурс (заблокированы). Тут собственно, и начинается мой вопрос. Почему они занимают место в executor? Почему executor не берёт на выполнение 2 оставшиеся задачи?
Я сам придумал что так должно быть?

При этом код хорошо работает, если заменить на executor = Executors.newCachedThreadPool();
Как реализовать то что я хочу (чтобы брал из очереди задачи, когда не может выполнять текущие)?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
А где они должны занимать место по вашему? Все потоки создаваемые executor'ом рождаются, работаю и умирают "внутри" пула. Если вам надо выполнять больше потоков, либо увеличивайте лимит, либо используйте CachedThreadPool. Чтобы поток занимался чем-нибудь другим в процессе ожидания ресурса, вам придётся самому переписать ваши Runnable\Callabe-таски, чтобы они проверяли состояние ресурса и в случае его блокировки делали что-нибудь другое.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Вы же сами написали:
newFixedThreadPool(8);

Какие после этого могут быть вопросы?

В общем, не надо там ничего в конструкторе указывать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы