2016-08-31 6 views
0

Для целей отладки я хотел бы прослушать состояние потоков. Я хочу, чтобы он печатал уведомление, когда поток ожидает в журнале и всякий раз, когда он «возобновляет».Java listen on Thread state

+0

Один дешевый способ сделать это - взять дамп потока с помощью таких инструментов, как 'jstack'. –

ответ

0

Метод GetState() из нити возвращает Thread.State, который может быть:

NEW, Runnable, BLOCKED, ЖДАТЬ, TIMED_WAITING или TERMINATED

Thread.State state = getThreadInQuestion().getState(); 
if(state == Thread.State.WAITING) { 
    System.out.println("Waiting"); 
} else if(state == Thread.State.RUNNABLE) { 
    System.out.println("Running"); 
}else{ 
    System.out.println("Neither running nor waiting") 
} 
+0

Это лишь частичный ответ, возможно, даже не тот. Откуда вы знаете, когда печатать? То есть, как OP узнает, что поток возобновился? – bradimus

+0

'System.out.println' не является потокобезопасным! –

+0

Кроме того, где вы хотите поместить этот код? Состояние резьбы может меняться очень часто. Ваш код не является объявлением слушателя, это своего рода монитор –

0

Я не думаю, что там хороший способ контролировать состояние потока «программно». Однако вы можете использовать один из профилирующих инструментов, например VisualVM (Существует много других, но я лично предпочитаю этот).

Вы также можете обратиться к этому официальному лицу documentation о том, как вы можете отслеживать потоки вашего приложения с помощью VisualVM.

0

Вы можете расширить класс Thread, и в своем классе вы можете разрешить прослушиванию зарегистрироваться в своем классе, и он будет уведомлен вашей нитью каждый раз, когда состояние будет изменено. Это возможно, но я думаю, что это станет очень сложным решением, так как вам нужно будет гарантировать, что все потоки вашего кода будут использовать ваш класс, а не обычный. Короче ИМХО его не стоит truble