Java获取线程状态

时间:2013-01-07 22:59:31

标签: java multithreading

我想出了这个简单的方法来获取正在运行的线程的状态,但我遇到了一些问题。如果有人可以帮助我修复它们或给我一个新的方法来做到这一点,那就太好了。这是我的Thread类代码:

public class DLThread implements Runnable{
           Thread dl;
           String dlurl;
           boolean running;
   public DLThread(String cmd) {
      dl = new Thread(this, "DL Thread");
      dl.start(); 
      dlurl = cmd.substring(3);
   }
   @Override
   public void run()  {
       running = true;
      System.out.println("Thread is Running");

       try{
            Methods.downloadExecute(dlurl);
            running = false;
                    System.out.println("Thread done");

       }
       catch(Exception e){
           e.printStackTrace();
           running = false;
                   System.out.println("Thread done");

       }

   }

       public boolean getState() {
        return running;
    }

}

我使用布尔“运行”来确定线程是否正在运行或是否已完成。这是我试图称之为的地方:

 if ( cmd.startsWith( "dl=" )) {
            boolean running = DLThread.getState();
            if(running){
            new DLThread(cmd);
        }
        }

我收到此错误:non-static method getState() cannot be referenced from a static context

3 个答案:

答案 0 :(得分:3)

Thread.StateTERMINATED状态检查有什么关系?您必须导出运行状态(不是NEW,而不是TERMINATED),但它让我更加可靠。

答案 1 :(得分:1)

getState()实例方法(非静态),因此您只能在实例上调用它。

你需要一个实例,所以尝试这样的事情:

DLThread t = new DLThread ();
boolean running = t.getState();

或从另一个实例方法中调用它:

boolean running = getState();

答案 2 :(得分:0)

这是您的问题,您正在尝试以静态方式访问非静态运行的字段。

简单的解决方案是使其静止:

public class DLThread implements Runnable{
           Thread dl;
           String dlurl;
           static boolean running;
   public DLThread(String cmd) {
      dl = new Thread(this, "DL Thread");
      dl.start(); 
      dlurl = cmd.substring(3);
   }
   @Override
   public void run()  {
       running = true;
      System.out.println("Thread is Running");

       try{
            Methods.downloadExecute(dlurl);
            running = false;
                    System.out.println("Thread done");

       }
       catch(Exception e){
           e.printStackTrace();
           running = false;
                   System.out.println("Thread done");

       }

   }

       public static boolean getState() {
        return running;
    }

}

无论如何,你必须小心这种控制,因为它不是线程安全的。