2013-03-13 27 views
6

スレッドがスリープ状態にあるかどうかをどのように知ることができるのだろうかと思っていました。 私は検索し、いくつかの情報を集めて、私がメソッドを書いたそれらの情報を構成しました isSleeping():booleanスレッドがスリープ状態かどうかを判断するためにクラスに入れることができると思います。私は逃したかもしれないことを知りたいだけです。注:私は0日の経験を経験していません。スレッドがスリープ状態にあるかどうかを調べる

//isSleeping returns true if this thread is sleeping and false otherwise. 
public boolean isSleeping(){ 
    boolean state = false; 
    StackTraceElement[] threadsStackTrace = this.getStackTrace(); 

    if(threadsStackTrace.length==0){ 
     state = false; 
    } 
    if(threadsStackTrace[0].getClassName().equals("java.lang.Thread")&& 
      threadsStackTrace[0].getMethodName().equals("Sleep")){ 
     state = true; 
    } 
    return state; 
} 

答えて

0

あなたはThread#getState()TIMED_WAITING状態を持っているかどうかを確認できます。このアプローチを使用する場合は、ちょうどObject#waitと呼ばれることがないように注意する必要があります。私はこのアイデアを持っている

0

、私はチェックしませんでしたが、私はそれが仕事だと思う:

あなたがスレッドを拡張し、状態を切り替えるために睡眠を上書きすることができます。 このような何か:

@Override 
public static void sleep(long millis, int nanos) 
throws InterruptedException { 
    SLEEPMARKER = true; 
    super.sleep(millis, nanos); 
    SLEEPMARKER = false; 
} 

@Override 
public static void sleep(long millis) 
throws InterruptedException { 
    SLEEPMARKER = true; 
    super.sleep(millis); 
    SLEEPMARKER = false; 
} 

その後、あなただけのマーカーおよびそのためのゲッターを必要としています。

public static boolean SLEEPMARKER = false; 
public static boolean isSleeping(){ 
    return SLEEPMARKER; 
} 
+0

考えてみましょうこれは、あなたが作成していない...メインを含むスレッド上で動作しません。 JVMを起動して起動時にこれを使用してすべてのスレッド作成をルートするように変更するだけで十分であるかどうかはわかりません。さらに、割り込みを受けた場合、スリープ状態になることがあります。 – djechlin

1

「スリープ」→「スリープ」に変更します。 thisでstacktraceを実行する必要はありませんが、メソッドでThreadパラメータを受け入れる必要があります。この

Thread t = new Thread(new Runnable(){ 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    t.start(); 
    Thread.sleep(100); 
    if(t.getStackTrace()[0].getClassName().equals("java.lang.Thread")&& 
      t.getStackTrace()[0].getMethodName().equals("sleep")){ 
     System.out.println("sleeping"); 
    } 

出力

sleeping 
+0

これは私の解決策より優れています。あなたは、眠っていない状態に備えておく必要があります。それはArrayIndexOutOfBoundsExceptionをスローする – CsBalazsHungary

+0

確かに、それはOPのアイデアが働いたことを証明することでした –

関連する問題