В ThreadPoolExecutor предусмотрено несколько стратегий. Ищите «AbortPolicy» в этом javadoc . Вы также можете реализовать свою собственную политику, если хотите. Возможно Discard
похоже на то, что вы хотите. Лично я думаю, что CallerRuns
- это то, что вы хотите в большинстве случаев.
Я думаю, что использовать это лучшее решение, но если вы абсолютно хотите реализовать его в очереди, я бы, вероятно, сделал это по составу. Возможно, используйте LinkedList
или что-то еще и оберните его ключевым словом synchronize
.
РЕДАКТИРОВАТЬ: (некоторые пояснения ..)
«Исполнитель» - это, по сути, пул потоков, объединенный с очередью блокировки. Это рекомендуемый способ реализации шаблона производитель / потребитель в Java. Авторы этих библиотек предлагают несколько стратегий для решения таких проблем, как вы упомянули. Если вам интересно, здесь - это другой подход, специально предназначенный для решения проблемы OOME (источник зависит от фреймворка и не может использоваться как есть).