Каков наилучший способ ограничения количества потоков, выполняемых конкретным методом? - PullRequest
3 голосов
/ 17 марта 2012

Положение

  • У меня есть веб-приложение
  • У меня есть класс, который выполняет сложные математические вычисления
  • Уравнения могут выполняться время от времени в зависимости от того, что запрос
  • Иногда многие потоки запускают это вычисление одновременно
  • Когда запущено слишком много вычислений, компьютер зависает (полное зависание = использование процессора 99)

Моя цель

Моя цель - избежать зависания / замерзания.

Я предполагаю, что это можно сделать, ограничив количество одновременных вычислений (вероятно, до NUMBER_OF_CPU_CORES - 1)

Вопрос

Как лучше всего достичь этой цели?

Я знаю, что есть java.util.concurrent.Semaphore , но, может быть, есть лучший подход?

Ответы [ 4 ]

7 голосов
/ 17 марта 2012

Взгляните на Java ThreadPoolExecutor Это должно помочь в том, что вы пытаетесь сделать.

Надеюсь, это поможет ...

2 голосов
/ 17 марта 2012

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

За исключением этого, Semaphore - идеальный инструмент. Используйте метод tryAcquire() и обязательно поместите соответствующий выпуск в блок finally, например:

if (permits.tryAcquire(7, TimeUnit.SECONDS)) 
  try {
    /* Do your computation. */
    compute();
  } finally {
    permits.release();
  }
else 
  /* Respond with "Too busy; try later," message. */
2 голосов
/ 17 марта 2012

Semaphore выглядит именно так, как вы хотите.

Возможно, вы захотите добавить некоторую логику, чтобы вы использовали Semaphore.tryAcquire и возвращали ошибку пользователю, если он не может получить разрешение. Если вы используете метод блокировки acquire, вы все равно получите заблокированный сервер.

0 голосов
/ 17 марта 2012

Уменьшите приоритет потоков, вызывающих ваш метод.Если остальные приложения на вашем компьютере не нагружают процессор, это вряд ли повлияет на ваши вычисления, но ответы на нажатия клавиш и т. Д. Все равно должны быть хорошими.

На самом деле, я удивлен, что окно зависло /зависание даже при перегрузке ЦП из нескольких готовых потоков (если не был повышен их приоритет).Вялый может быть ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...