Как один поток Java проверяет состояние другого, например. заблокирован ли другой?

Это вопрос, заданный одному из моих друзей во время интервью.

Откуда вы знаете, заблокирован ли поток внутри синхронизированного метода, из другого потока?

Может кто-нибудь объяснить это с помощью примера?

Ответы

Ответ 1

Использование Thread.getState():

Thread.State state = getThreadInQuestion().getState();
if(state == Thread.State.BLOCKED) {
    System.out.println("Blocked");
} else {
    System.out.println("Not blocked");
}

Вне виртуальной машины вы можете использовать инструмент jstack для получения полной информации о потоках для каждого потока или подключения к JMX и изучения MBeans Thread.

Ответ 2

Мой короткий ответ будет "нет, не надежно".

Кто-то упомянул проверку getState() == Thread.State.BLOCKED. Однако, к тому времени, как вы получите ответ, он может быть уже устаревшим, если заблокированный поток ожидает на мониторе, заблокированном третьим потоком, и монитор будет выпущен так же, как getState вот-вот вернется.

Ответ 3

Я не знаю, знаете ли вы это. Но вы можете сделать Thread.currentThread(), который сообщит вам поток, который выполняет этот метод.

Ответ 4

Thread t1 = new Thread(); Thread.State state = t1.getState();