почему ScheduledThreadPoolExecutor не предоставляет конечную очередь? - PullRequest
1 голос
/ 30 марта 2019

ScheduledThreadPoolExecutor расширяет ThreadPoolExecutor, но с меньшим количеством конструктора, ScheduledThreadPoolExecutor обеспечивает бесконечное delayQueue, поэтому, если я отправляю слишком много много задач, это может вызвать JOMM OOM, почему он не предоставляет конечную очередь и отклонить политика (отклонить, если не удается отправить новое задание)?

1 Ответ

0 голосов
/ 30 марта 2019

Почему он не предоставляет конечную очередь и политику отклонения (отклонять, когда не удается отправить новое задание)?

Вам нужно будет спросить дизайнеров, но тот факт, что онирешил не поддерживать это предполагает , что они думали, что это будет бесполезно.(Или, по крайней мере, не достаточно полезно , чтобы оправдать дополнительную сложность.)

Есть и другая причина.Реализация ScheduledThreadPoolExecutor зависит от очереди, возвращающей элементы в правильном порядке.Если вы посмотрите на исходный код, вы увидите, что он использует собственный класс очереди для этого.Есть комментарий, который говорит это:

Использование пользовательской очереди (DelayedWorkQueue), вариант неограниченного DelayQueue.Отсутствие ограничений по емкости и тот факт, что corePoolSize и maximumPoolSize фактически идентичны, упрощает некоторые механизмы выполнения (см. delayedExecute) по сравнению с ThreadPoolExecutor.

Кроме того, очевидно, чтореализация очереди задержки должна иметь определенные операционные свойства, чтобы исполнитель работал правильно и эффективно.Возможно, именно поэтому они не позволяют вам предоставлять собственную реализацию очереди.

Наконец, если вы хотите, чтобы ваше приложение накладывало ограничение на размер очереди задержки, вы можете использовать yourPool.getQueue().length() для проверки очереди.длина до планирования новой задачи.

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