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