Вопрос

У меня есть блокирующая очередь, и работники берут данные из этой очереди, а затем работают примерно 1-10 мс.

Я хотел бы вычислить некоторую относительную цифру того, сколько времени работник был активен и простаивал в данный период времени (например, 70% активности в последнюю минуту).

Суммирование коротких периодов в 1 мс может быть неточным, а выборка времени nano требует большой производительности.

Есть ли какой-нибудь аккуратный способ выполнить такую задачу?

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

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

Это было полезно?

Решение

Как насчет подхода, который выбирает Thread.getState() каждого потока в вашем пуле, а затем сообщает о проценте потоков, которые были в каждом состоянии, когда были взяты образцы?

Таким образом, вы могли бы получить представление о том, как часто потоки оказывались в НОВЫХ, ВЫПОЛНЯЕМЫХ, ЗАБЛОКИРОВАННЫХ, ОЖИДАЮЩИХ, TIMED_WAITING и ЗАВЕРШЕННЫХ.

Единственный другой подход, который я могу придумать, - это запустить ваш код в инструменте профилирования.Java profiler от YourKit очень хорош и поставляется с 1530-дневной пробной лицензией...

http://www.yourkit.com/java/profiler/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top