Динамическое управление пулом потоков - PullRequest
3 голосов
/ 12 октября 2011

У меня есть три типа задач A, B, C, которые должны быть выполнены с минимальными порогами в пуле потоков:

  • (A) 70%
  • (B) 20%
  • (C) 10%

Размер пула: 100 потоков.

Как обеспечить в любой момент времени следующее распределение:

  1. Нет свободных потоков: если, например, существуют только задачи типа C, пул будет на 100% C
  2. Без голодания: задачи B и C в конечном итоге будут обслуживаться

1 Ответ

1 голос
/ 28 апреля 2012

Вам следует попробовать следующую стратегию:

  • поддерживает PriorityBlockingQueue со всеми элементами, вставленными в очередь, имеющими поле приоритета, которое является основой для сравнения. Пусть задачи типа C имеют приоритет 0, B имеют 10, а A имеют 20 (более низкие значения == более высокий приоритет)
  • Поддерживать отдельную очередь «отслеживания» активных элементов B в PriorityBlockingQueue. Отдельный экземпляр Timer пытается удалить все элементы B из PriorityBlockingQueue, в случае успеха он уменьшает приоритет для B и повторно вставляет его в PriorityBlockingQueue - это гарантирует отсутствие голодания для элементов типа B. Неудачные попытки означают, что элемент уже обработан и элемент должен быть удален из очереди отслеживания.
  • Потоки в пуле потоков пытаются извлечь элемент из очереди, прежде чем работать с ним.
...