2013-03-13 12 views
6

Mi chiedevo come potrei sapere se un thread sta dormendo o meno. Ho cercato in giro e ho raccolto alcune informazioni, da quelle informazioni ho scritto un metodo isSleeping(): booleano che penso di poter inserire in una classe per determinare se il thread sta dormendo o meno. Voglio solo sapere cosa potrei aver perso. Nota: non ho esperienza di 0 giorni di esperienza.Determinare se il thread sta dormendo

//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; 
} 

risposta

0

Si potrebbe verificare se Thread#getState() ha uno stato TIMED_WAITING. se si utilizza questo approccio, si dovrebbe prestare attenzione per garantire che non si è appena chiamato Object#wait.

0

ho questa idea, non ho controllato, ma penso che avrebbe funzionato:

è possibile estendere il filo e sovrascrivere il sonno per cambiare uno stato. Qualcosa di simile a questo:

@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; 
} 

quindi è necessario solo il marcatore e un getter per questo.

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

Quindi questo non funzionerà su discussioni non si crea ... tra cui principale. Non so quanto sia facile arrivare sotto il cofano abbastanza da cambiare la JVM per usarla all'avvio e instradare tutta la creazione di thread attraverso di essa. Inoltre sarai permanentemente bloccato in uno stato di sospensione durante l'interruzione. – djechlin

1

Modifica "Sleep" -> "sleep". Inoltre, non dovresti prendere stacktrace su this, il tuo metodo dovrebbe accettare un parametro Thread. Considerate questo

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"); 
    } 

uscita

sleeping 
+0

Questo è meglio della mia soluzione. Hai solo bisogno di prepararti per lo stato di non sonno. Getta ArrayIndexOutOfBoundsException – CsBalazsHungary

+0

Certo, è stato solo per dimostrare che OP ha funzionato –

Problemi correlati