-1

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

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

4

3 回答 3

3

Thread.State和检查TERMINATED状态有什么问题?您必须导出运行状态(不是NEW,不是TERMINATED),但它让我觉得更可靠。

于 2013-01-07T23:02:55.700 回答
1

getState()是一个实例方法(非静态),所以你只能在一个实例上调用它。

您将需要一个实例,因此请尝试以下操作:

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

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

boolean running = getState();
于 2013-01-07T23:01:53.253 回答
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;
    }

}

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

于 2013-01-07T23:04:15.970 回答