Использование нескольких ярлыков в Java Application Monitor (JAMon)

62
4

Возможно ли контролировать различные этапы обработки с использованием одного и того же класса JAMon Monitor? Например, в примере кода я хотел бы измерить время выполнения "Point1" и "Point2". Однако пример возвращает только статистику о втором шаге. Конечно, я могу создать несколько объектов типа Monitor. Но, может быть, есть более чистый способ?

Monitor mon = null;     
for(int i =0; i < 1000; i++){
//Part1
mon = MonitorFactory.start("Point 1");
Thread.sleep(2);
mon.stop();

//Part2
mon = MonitorFactory.start("Point 2");
mon.stop();
}

System.out.println(mon.toString());

Вывод:

JAMon Label = Point 2, Units = ms.: (LastValue = 0.0, Hits = 1000.0, Avg = 0.001, Total = 1.0, Min = 0.0, Max = 1.0, Active = 0.0, Avg Active = 1.0, Max Active = 1.0, Первый доступ = ср 17 июн 10:40:44 CEST 2015, последний доступ = ср 17 июн 10:40:46 CEST 2015)

Желаемый результат:

JAMon Label = Point 1, Units = ms.: (LastValue = 0.0, Hits = 1000.0, Avg = 0.001, Total = 1.0, Min = 0.0, Max = 1.0, Active = 0.0, Avg Active = 1.0, Max Active = 1.0, Первый доступ = ср 17 июн 10:40:44 CEST 2015, последний доступ = ср 17 июн 10:40:46 CEST 2015)

JAMon Label = Point 2, Units = ms.: (LastValue = 0.0, Hits = 1000.0, Avg = 0.001, Total = 1.0, Min = 0.0, Max = 1.0, Active = 0.0, Avg Active = 1.0, Max Active = 1.0, Первый доступ = ср 17 июн 10:40:44 CEST 2015, последний доступ = ср 17 июн 10:40:46 CEST 2015)

спросил(а) 2015-06-17T11:49:00+03:00 4 года, 5 месяцев назад
2
Решение
59

Вы можете изменить вызов toString() монитора на явный вызов getMonitor (...).

Monitor mon = null;   

for(int i =0; i < 1000; i++){
//Part1
mon = MonitorFactory.start("Point 1");
Thread.sleep(2);
mon.stop();

//Part2
mon = MonitorFactory.start("Point 2");
mon.stop();
}

System.out.println(MonitorFactory.getMonitor("Point 1").toString());
System.out.println(MonitorFactory.getMonitor("Point 2").toString());

Или вы можете создать 2 монитора.

Monitor mon1 = null;   
Monitor mon2 = null;

for(int i =0; i < 1000; i++){
//Part1
mon1 = MonitorFactory.start("Point 1");
Thread.sleep(2);
mon1.stop();

//Part2
mon2 = MonitorFactory.start("Point 2");
mon2.stop();
}

System.out.println(mon1.toString());
System.out.println(mon2.toString());

ответил(а) 2015-07-16T10:30:00+03:00 4 года, 4 месяца назад
Еще 1 ответ
33

Существует лучший способ, чем другой ответ:

for( Object monitor: MonitorFactory.getMap().values() ){
System.out.println( monitor );
}

Это будет печатать все используемые мониторы до сих пор. Во всех потоках. Именно то, что вы хотите.

Вы можете проверить завершенный пример кода и вывод здесь.

ответил(а) 2015-11-27T18:02:00+03:00 4 года назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема