Я пытаюсь использовать ThreadPoolExecutor для планирования задач, но в некоторых проблемах с его политиками. Здесь его заявленное поведение:
- Если работает меньше потоков corePoolSize, Executor всегда предпочитает добавлять новый поток, а не выполнять очередность.
- Если запускается corePoolSize или больше потоков, Executor всегда предпочитает размещать запрос, а не добавлять новый поток.
- Если запрос не может быть поставлен в очередь, создается новый поток, если это не будет превышать maximumPoolSize, и в этом случае задача будет отклонена.
Поведение, которое я хочу, следующее:
- как указано выше
- Если работает больше, чем corePoolSize, но меньше потоков MaximumPoolSize, предпочитает добавлять новый поток в очередь и использовать простаивающий поток для добавления нового потока.
- как указано выше
В принципе, я не хочу, чтобы какие-либо задачи были отклонены; Я хочу, чтобы они были поставлены в очередь в неограниченной очереди. Но я хочу иметь до максимум потоковPoolSize. Если я использую неограниченную очередь, она никогда не генерирует потоки после того, как она ударит coreSize. Если я использую ограниченную очередь, он отклоняет задачи. Есть ли способ обойти это?
Теперь я думаю о запуске ThreadPoolExecutor на SynchronousQueue, но не напрямую направляет задачи на него, а вместо этого направляет их в отдельный неограниченный LinkedBlockingQueue. Затем другой поток подается из LinkedBlockingQueue в Executor, и если он отклоняется, он просто пытается снова, пока он не будет отклонен. Это похоже на боль и немного взлома, однако - есть ли более чистый способ сделать это?