Ищем Java ThreadPool с возможностью отката к последовательному выполнению - PullRequest
0 голосов
/ 17 апреля 2020

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

Эффект net, которого я пытаюсь достичь, состоит в параллельном выполнении, когда это возможно, и когда пул потоков полностью заполнен, выполняет оставшиеся задачи последовательно в текущем потоке. - то есть, когда была сделана попытка планирования - не дожидаясь, пока пул потоков вернет другой поток.

Хотя это кажется выполнимым, я все же чувствую, что сделать это правильно - значительный объем работы - возможно, в основном для тестирования - мудро, убедившись, что все угловые случаи правильно рассмотрены, и т. д. c).

Я бы хотел не изобретать велосипед заново, если эта поддержка легко доступна в той или иной форме в одном из JDK. связанный с потоками libr Все классы.

Если бы некоторые другие широко известные библиотеки, такие как Guava или Apache Commons, предлагали такую ​​функциональность, мне было бы любопытно знать об этом тоже.

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете достичь желаемого с помощью стандартного ThreadPoolExecutor :

  • Чтобы остановить очереди задач, когда нет доступных потоков, используйте SynchronousQueue в качестве реализации очереди.
  • Чтобы вызывающая сторона запускала отправленную задачу, когда в пуле нет потока, используйте ThreadPoolExecutor.CallerRunsPolicy в качестве политики отклонения задачи.

Эти два параметра можно установить, вызвав конструктор:

ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit,
    new SynchronousQueue<>(), new ThreadPoolExecutor.CallerRunsPolicy()) 
...