web-dev-qa-db-ja.com

Java-スレッドがいつ待機しているかを知る方法は?

スレッドがいつwaitステータスになったかを知るためのきちんとした解決策はありますか?スレッドをwaitに配置し、必要なときにnotifyします。しかし、スレッドが現在待機しているかどうかを知りたい場合があります。待機している場合は、別のことを行う必要があります。

私はおそらく自分でフラグをtrue/falseに設定することができます。しかし、これを行うためのより良い方法があるとは想像できませんか?

25
Stefan Hendriks

スレッドのメソッドgetState()Thread.Stateを返します。これは次のようになります。

NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、またはTERMINATED

Thread.State を参照してください。

40
Alexander Egger

Thread.getState を見たことがありますか?

3
Konamiman
3
JuanZe

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();

    }
}
0
Laurent K