7

スレッドがスリープしているかどうかをどうやって知ることができるのだろうと思っていました。 私は周りを検索し、スレッドがスリープしているかどうかを判断するためにクラスに入れることができるメソッド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;
}
4

3 に答える 3

2

「スリープ」→「スリープ」に変更。でスタックトレースを使用しないthisでください。また、メソッドは 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
于 2013-03-13T15:26:14.563 に答える
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;
}
于 2013-03-13T15:22:03.243 に答える
0

Thread#getState()に状態があるかどうかを確認できますTIMED_WAITING。このアプローチを使用する場合は、呼び出したばかりではないことを確認する必要がありますObject#wait

于 2013-03-13T15:19:43.627 に答える