Java - 如何知道线程何时处于等待状态?

28

有没有一种简洁的解决方法可以知道线程何时被置于等待状态?我将线程置于等待状态,当需要时我会通知它们。但有时我想知道线程当前是否正在等待,如果是,则必须执行其他操作。

我可能可以自己设置一个标志来表示真/假。但我想不出还有更好的方法吗?

4个回答

47

线程的方法getState()返回一个Thread.State枚举类型的值,可能是:

NEW(新建), RUNNABLE(可运行), BLOCKED(阻塞), WAITING(等待中), TIMED_WAITING(计时等待) 或 TERMINATED(已终止)

请参阅Thread.State


3
当然,在方法返回时,状态可能已经改变。 - Tom Hawtin - tackline
这种轮询线程状态的做法通常是好的实践吗? - Coder Guy
@JonathanNeufeld 取决于你想做什么,但通常情况下不进行轮询不是一个好主意。 - Alexander Egger
@alexander.egger 是的,我认为我会同意,最近我在某些应用程序代码中遇到了一个问题,这让我认为在主UI线程中任何阻塞都是错误的。 - Coder Guy

4

4

1
你可以使用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();

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接