Этот вопрос является продолжением этого .
По сути, я делаю объявление ThreadPoolExecutor
только с одним потоком. Я переопределяю метод beforeExecute()
, чтобы перевести сон в режим ожидания, чтобы каждая из моих задач выполнялась с некоторой задержкой между собой. Это в основном для передачи процессора другим потокам, так как мой поток отчасти перебивает.
Итак, ожидаемое поведение:
Для каждой новой задачи в ThreadPoolExecutor
она вызывает функцию before execute перед выполнением задачи и, следовательно, спит, скажем, 20 секунд, прежде чем выполнить задачу.
Однако вот что я вижу:
Для каждого представленного нового задания:
- Выполняет задачу
- Вызывает метод beforeExecute
- спит, скажем, 20 с
- ПОВТОРНО ВЫПОЛНИТЬ задание!
Порядок 1. & 2. не всегда одинаков.
Вот мои вопросы:
- Похоже, что новый поток приходит после / во время сна и идет вперед и выполняет мою задачу сразу же, пока фактический поток спит.
Так ThreadPoolExecutor
порождает новый поток, как только существующий поток спит [думая, что поток завершен] ??
Я попытался поместить keepAliveTime> sleeptime .., чтобы в случае, если вышеприведенное утверждение было верным .., по крайней мере, он ожидает больше времени ожидания, чтобы порождать новую нить ... [надеясь, что спящий нить проснется ThreadPoolExecutor
отбросит идею создания новой темы
- Даже если он порождает новый поток и сразу же выполняет мою задачу, с какой стати задача будет повторно выполняться после пробуждения спящего потока !! Разве задача не должна быть удалена из очереди задач до этого ??
- Я что-то здесь упускаю? Есть ли другой способ отладки этого сценария?
=> Альтернативный метод, который я думал, чтобы выполнить желаемую задачу [а не решить проблему], заключался в том, чтобы обернуть рабочий объект еще одним работающим и перевести внешний в рабочий режим перед вызовом внутреннего.