代码之家  ›  专栏  ›  技术社区  ›  Stefan Hendriks

Java -如何知道线程在等待什么?

  •  25
  • Stefan Hendriks  · 技术社区  · 15 年前

    有什么清楚的方法可以知道什么时候穿了线吗 wait 状态?我正在给 等待 而我 notify 当我需要的时候。但有时我想知道线程是否正在等待,如果正在等待,我必须做其他的事情。

    我可能会自己设置一个标志为真/假。但我无法想象有更好的方法来做到这一点?

    4 回复  |  直到 15 年前
        1
  •  39
  •   Alexander Egger    15 年前

    方法 getState() 线程的返回 Thread.State 可以是:

    新建、可运行、阻止、等待、定时等待或终止

    Thread.State .

        2
  •  3
  •   Konamiman    15 年前

    你看过吗 Thread.getState ?

        4
  •  0
  •   Laurent K    15 年前

    您可以使用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();
    
        }
    }