Подтвердить что ты не робот

Java - Как узнать, когда поток ждет?

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

Я мог бы, вероятно, сам установить флаг true/false. Но я не могу представить, что есть лучший способ сделать это?

4b9b3361

Ответ 1

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

NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING или TERMINATED

См. Thread.State.

Ответ 4

У вас может быть вся информация, которую вы хотите использовать с помощью ThreadMXBean.

Попробуйте этот код:

package com.secutix.gui.seatmap;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

public class ThreadStatus {

    private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean();

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            buildAndLaunchThread(i);
        }

        Thread t = new Thread(){

            @Override
            public void run() {
                while(true){
                    printThreadStatus();
                    try {
                        sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }

        };
        t.setName("detector");
        t.start();

    }

    protected static void printThreadStatus() {
        ThreadInfo[] infos = mbean.dumpAllThreads(true, true);

        for (ThreadInfo threadInfo : infos) {
            System.out.println(threadInfo.getThreadName() + " state = " + threadInfo.getThreadState());
        }

    }

    private static void buildAndLaunchThread(int i) {
        Thread t1 = new Thread(){

            @Override
            public void run() {
                while(true){
                    try {
                        sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }

        };
        t1.setName("t" + i);
        t1.start();

    }
}