Как проверить, спит ли поток? - PullRequest
10 голосов
/ 17 марта 2011

Есть ли способ проверить, спит ли данный поток?

Ответы [ 5 ]

18 голосов
/ 17 марта 2011

Вы можете позвонить Thread.getState() и проверить, является ли состояние TIMED_WAITING.

Обратите внимание, однако, что TIMED_WAITING не обязательно означаетчто поток вызвал sleep(), он также может ожидать вызова Object.wait(long) или чего-то подобного.

3 голосов
/ 17 марта 2011

Вот довольно уродливый хак, чтобы проверить, не спит ли другой поток:

public static boolean isSleeping(Thread t) {
    StackTraceElement[] ste = t.getStackTrace();

    if (ste.length == 0)
        return false;     // thread has terminated!

    return ste[0].getClassName().equals("java.lang.Thread")
        && ste[0].getMethodName().equals("sleep");
}
0 голосов
/ 17 марта 2011

на самом деле я этого не делал, но есть интерфейс ThreadMXBean для получения информации о потоке

, который возвращает класс ThreadInfo , там вы можете получить что-то с помощью getWaitedTimeспособ.

0 голосов
/ 17 марта 2011

Вы можете создать свой собственный sleep метод, который записывает идентификатор потока в глобальную переменную и использовать его как ссылку для спящего потока.

Нет другого способа узнать, точно ли поток спит.

Надеюсь три ссылки ниже справки:

0 голосов
/ 17 марта 2011

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

...