2015-02-23 1 views
2

Предположим, у меня есть следующие программы:Как раз, когда программа игнорирует время тратить на ожидание других потоков

public class ProgramA { 
    public void doSomething(ProgramC c) { 
    c.doSomething(); 
    // Do something else that takes 5 seconds. 
    } 
} 

public class ProgramB { 
    public void doSomething(ProgramC c) { 
    c.doSomething(); 
    // Do something else that takes 2 seconds. 
    } 
} 

public class ProgramC { 
    public synchronized void doSomething() { 
    // Do something that takes 10 seconds 
    } 
} 

Хочу времени программы А и программы В, чтобы выяснить, как долго они принимают (с помощью секундомера гуавы или аналогичный). Когда вы запускаете серийный номер, я получаю 15 и 12 секунд, как ожидалось. Однако при параллельном запуске я получаю, например, 15s и 22s, так как программа B проводит время, ожидая блокировки программы C.

Есть ли способ игнорировать время, потраченное на блокирование таким образом и получить те же тайминги, что и при запуске в последовательном режиме? Еще более полезным будет разбивка, например. «Программа B приняла 22s, из которых 10s блокировали на других потоках»

+0

Так что вы хотите получить статистику по различным состояниям, в которых ваши потоки похожи, как часто ваши потоки блокируются или не работают? – NESPowerGlove

+0

Я действительно хочу знать, когда программа пошла медленнее по причинам, не связанным с потоковой обработкой, например. если программа A начнет принимать 25 секунд, а не 15 секунд, я хотел бы знать, что дополнительные 10-ые из-за конфликтов потоков, а не регрессии производительности в другом месте программы. –

+0

Вы можете профилировать свое приложение, а также просматривать состояния потоков с помощью visualvm. – NESPowerGlove

ответ

-1

Если вы хотите, чтобы следить за этим на уровне потоков, можно назвать getState() на Thread объект, чтобы увидеть, как долго каждый Thread имеет BLOCKEDstate, сравниваемую к состоянию RUNNABLE.