ExecutorService с количеством запущенных задач

Я хочу получить количество задач, которые отправлены в службу-исполнитель и еще не завершены (т.е. в настоящее время запущены / активны или поставлены в очередь). В сервисе-исполнителе нет встроенного метода для этого.

((ThreadPoolExecutor) executorService).getActiveCount()

Это «Возвращает приблизительное количество потоков, которые активно выполняют задачи».

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


person Dexter    schedule 03.02.2015    source источник
comment
если вы хотите дождаться завершения ваших задач, вы можете использовать ExecutorCompletionService.   -  person jtahlborn    schedule 01.02.2017


Ответы (1)


Давайте посмотрим на задачу: точную цифру можно будет сказать только в том случае, если вы остановите систему, посчитаете, вернетесь, запустите систему. В противном случае: во время подсчета потоки могут начинаться и заканчиваться, поэтому число является приблизительным.

См. Реализацию в OpenJDK8:

1812    public int More ...getActiveCount() {
1813        final ReentrantLock mainLock = this.mainLock;
1814        mainLock.lock();
1815        try {
1816            int n = 0;
1817            for (Worker w : workers)
1818                if (w.isLocked())
1819                    ++n;
1820            return n;
1821        } finally {
1822            mainLock.unlock();
1823        }
1824    }

Реализация проста, но это как считать муравьев, не убивая их: они будут приходить и уходить, пока вы считаете.

person thst    schedule 03.02.2015
comment
Итак, если новые муравьи не появятся, пока я считаю (я могу в этом убедиться), я получу результат, в котором будет указано не более x запущенных задач? Потому что задание могло закончиться, пока я считал? - person Dexter; 04.02.2015
comment
Вы бы посоветовали мне вести счетчик или getActiveCount надежен? - person Dexter; 04.02.2015
comment
Это правильно. По поводу точного счетчика: каков ваш план? зачем тебе этот счетчик? Обычно, когда вы останавливаете свою систему, вы ждете несколько секунд, проверяете, все ли ушли, повторяете, пока вам не надоест, отправляете прерывания, ждете agsin, убиваете их все или убиваете os. Для отображения ватерлинии мне подходит встроенный счетчик, также для графиков и тому подобного. Если у вас так много задач, что их подсчет в цикле обходится очень дорого, вам может понадобиться счетчик. - person thst; 04.02.2015
comment
В моем случае выполнения будет не более 8-9 задач. Я в основном хочу убить свой процесс, если задача не выполняется. - person Dexter; 04.02.2015
comment
Я полагаю, вам придется немного подождать / контролировать, а затем закончить, когда счетчик достигнет нуля. Если это слишком медленно для ваших целей, вам необходимо самостоятельно реализовать счетчик или реестр работников с прямым подключением к жизненному циклу работника. - person thst; 04.02.2015