Как определить, что пул потоков простаивает в Java - PullRequest
5 голосов
/ 30 сентября 2009

У меня есть пул потоков, созданный с использованием

   java.util.concurrent.ThreadPoolExecutor

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

Я искал в Интернете, и все решения не работают для меня. Например, я не хочу закрывать пул, чтобы awaitTermination () не работал. Я также знаю, как getTaskCount (), но я не хочу продолжать опрашивать пул, который тратит процессор.

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

Ответы [ 2 ]

5 голосов
/ 30 сентября 2009

Вы можете создать подкласс ThreadPoolExecutor и добавить хуки с beforeExecute и afterExecute для отслеживания выполнения задач, как вам нравится, включая базовую математику для подсчета текущих выполняющихся задач. Существует также прямой доступ к очереди с помощью getQueue ().

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

3 голосов
/ 01 октября 2009

Мне интересно, будет ли это работать в реальных условиях. Он включает в себя создание подкласса ThreadPoolExecutor и передачу ему IdleListener:

  @Override
  protected void beforeExecute(Thread t, Runnable r)
  {
    super.beforeExecute(t, r);
    listener.working();
  }

  @Override
  protected void afterExecute(Runnable r, Throwable t)
  {
    super.afterExecute(r, t);
    long activeCount = getTaskCount() - getCompletedTaskCount();
    if (activeCount == 1) // yes, one
    {
      listener.idle();
    }
  }

Интерфейс:

  interface IdleListener
  {
    void working();
    void idle();
  }
...