-1

実行中のスレッドの状態を取得するためのこの簡単な方法を思いつきましたが、いくつかの問題が発生しました。誰かが私がそれらを修正するのを手伝ってくれるか、これを行うための新しい方法を私に与えることができれば、それは素晴らしいことです。これが私の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;
    }

}

ブール値の「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.StateTERMINATED状態のチェックはどうなっていますか?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 に答える