Java измеряет использование потоков
-
25-10-2019 - |
Вопрос
У меня есть блокирующая очередь, и работники берут данные из этой очереди, а затем работают примерно 1-10 мс.
Я хотел бы вычислить некоторую относительную цифру того, сколько времени работник был активен и простаивал в данный период времени (например, 70% активности в последнюю минуту).
Суммирование коротких периодов в 1 мс может быть неточным, а выборка времени nano требует большой производительности.
Есть ли какой-нибудь аккуратный способ выполнить такую задачу?
У меня в коде чаще встречаются такие настройки работы с очередью, поэтому я хотел бы иметь возможность профилировать узкие места во время выполнения.
Редактировать: Я только хочу знать, может ли этот поток работать.Если операционная система выводит поток из фокуса обработки, он все равно будет учитываться.Только при ожидании в очереди блокировка должна учитываться как время простоя.
Решение
Как насчет подхода, который выбирает Thread.getState() каждого потока в вашем пуле, а затем сообщает о проценте потоков, которые были в каждом состоянии, когда были взяты образцы?
Таким образом, вы могли бы получить представление о том, как часто потоки оказывались в НОВЫХ, ВЫПОЛНЯЕМЫХ, ЗАБЛОКИРОВАННЫХ, ОЖИДАЮЩИХ, TIMED_WAITING и ЗАВЕРШЕННЫХ.
Единственный другой подход, который я могу придумать, - это запустить ваш код в инструменте профилирования.Java profiler от YourKit очень хорош и поставляется с 1530-дневной пробной лицензией...