Создает ли ThreadPoolExecutor новый поток, если текущий поток спит - PullRequest
0 голосов
/ 07 октября 2010

Этот вопрос является продолжением этого .

По сути, я делаю объявление ThreadPoolExecutor только с одним потоком. Я переопределяю метод beforeExecute(), чтобы перевести сон в режим ожидания, чтобы каждая из моих задач выполнялась с некоторой задержкой между собой. Это в основном для передачи процессора другим потокам, так как мой поток отчасти перебивает.

Итак, ожидаемое поведение:

Для каждой новой задачи в ThreadPoolExecutor она вызывает функцию before execute перед выполнением задачи и, следовательно, спит, скажем, 20 секунд, прежде чем выполнить задачу.

Однако вот что я вижу:

Для каждого представленного нового задания:

  1. Выполняет задачу
  2. Вызывает метод beforeExecute
  3. спит, скажем, 20 с
  4. ПОВТОРНО ВЫПОЛНИТЬ задание!

Порядок 1. & 2. не всегда одинаков.

Вот мои вопросы:

  1. Похоже, что новый поток приходит после / во время сна и идет вперед и выполняет мою задачу сразу же, пока фактический поток спит.
    Так ThreadPoolExecutor порождает новый поток, как только существующий поток спит [думая, что поток завершен] ?? Я попытался поместить keepAliveTime> sleeptime .., чтобы в случае, если вышеприведенное утверждение было верным .., по крайней мере, он ожидает больше времени ожидания, чтобы порождать новую нить ... [надеясь, что спящий нить проснется ThreadPoolExecutor отбросит идею создания новой темы
  2. Даже если он порождает новый поток и сразу же выполняет мою задачу, с какой стати задача будет повторно выполняться после пробуждения спящего потока !! Разве задача не должна быть удалена из очереди задач до этого ??
  3. Я что-то здесь упускаю? Есть ли другой способ отладки этого сценария?

=> Альтернативный метод, который я думал, чтобы выполнить желаемую задачу [а не решить проблему], заключался в том, чтобы обернуть рабочий объект еще одним работающим и перевести внешний в рабочий режим перед вызовом внутреннего.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Я думаю, что вы ищете ScheduledExecutorService

Из того, что я понимаю по вашему вопросу, scheduleAtFixedRate (...) должен заключить сделку:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

Создает и выполняет периодическое действие который становится активным первым после с учетом начальной задержки, а затем с заданным периодом; то есть казни начнутся после initialDelay затем initialDelay + period, затем initialDelay + 2 * period и так на.

0 голосов
/ 08 октября 2010
  1. Нет, это не так. ThreadPoolExecutor знает, что у него есть рабочий поток, даже если этот рабочий RUNNABLE, WAITING, BLOCKED или любое другое состояние.
  2. Задание удаляется из BlockingQueue задолго до вызова метода beforeExecute.
  3. Вы можете посмотреть код для API самостоятельно и определить, что он делает. Каждая установка Java JDK включает в себя файл «src.zip», который содержит всю библиотеку Java. Если вы еще этого не сделали, вы можете присоединить этот источник к eclipse, а затем при отладке в eclipse, погружении в метод библиотеки покажет вам источник, а не только файл класса.
...