#java #concurrency #threadpoolexecutor
#java #параллелизм #threadpoolexecutor
Вопрос:
Может ли Threadpoolexecutor изменять свою очередь блокировки после запуска? Я использую несколько threadpoolexecutors в своем процессе. Я не хочу нарушать максимальное количество потоков, превышающее определенное число в моем процессе. Вот почему я подумал об идее переключения blockingqueue моего threadpool на более загруженный blockingqueue. Но я не вижу никакой функции в классе ThreadPoolExecutor, которая предоставляла бы возможность переключения blockingqueues. Что может быть причиной этого?
Комментарии:
1. «В чем может быть причина этого?» Во время разработки это не считалось полезной функциональностью. Я не выношу суждения о том, действительно ли это полезно или нет. (Но предположительно эта функциональность может быть обработана внутри
BlockingQueue
реализации, таким образом, нет необходимости в TPE для ее обработки тоже.)2. Может быть, вам нужно использовать общий пул вместо нескольких исполнителей пула ad. docs.oracle.com/javase/8/docs/api/java/util/concurrent /…
3. @PratapiHemantPatel Это не будет хорошим решением. Я работаю над монолитной архитектурой. Разные потоки используются для записи в разные ресурсы (сокет, jms и базу данных). Если я буду использовать один и тот же threadpool для записи на всех ресурсах, то, возможно, из-за записи в БД события jms будут голодать. Это нежелательное поведение, потому что подписчики ожидают событий JMS, в то время как никто не будет ждать записи в БД.
Ответ №1:
По-видимому, threadpoolexecutor предоставляет доступ к своему blockingqueue. Я могу добиться такого же поведения, перенося задачи из одной очереди в другую очередь.
Ответ №2:
Неизменяемые объекты обычно предпочтительны в современной практике программирования. Обычно это приводит к сбоям… Проще в отношении роста объектной модели и будущих улучшений (И нет, я не считаю подход python «Давайте все будем ответственными взрослыми» современным ради аргументации).
Что касается решения вашей проблемы, вы. возможно, могли бы передать интеллектуальную «делегирующую» BlockingQueue
реализацию, которая будет реализовывать стандартный интерфейс, но подкрепит его некоторым механизмом переключения очередей, управляемым внутренне или внешне, как того требует ваша спецификация