2014-12-15 15 views
12

Sono un po 'confuso con il comportamento di thread.isInterrupted nel programma di seguito.Comportamento diverso quando si chiama thread.isInterrupted e stampa il risultato

public class ThreadPractice { 

    public static void main(String args[]) throws InterruptedException { 

     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        System.out.println("Starting thread..." + Thread.currentThread().getName()); 
        Thread.sleep(10000); 
        System.out.println("Waking up"); 
       }catch(InterruptedException e){ 
        System.out.println("Thread is interrupted!!!"); 
        Thread.currentThread().interrupt(); 
       } 
      } 
     }); 

     t.start(); 
     Thread.sleep(2000); 
     t.interrupt(); 
     //System.out.println(!t.isInterrupted()); 
     while(!t.isInterrupted()){ 
      System.out.println("Current thread not interrupted!!!"); 
     } 
    } 
} 

Quando si esegue il programma di cui sopra in quanto tale, esso stampa,

Starting thread...Thread-0 
Thread is interrupted!!! 

Ma quando ho rimuovere il commento la dichiarazione System.out per stampare lo stato di interruzione, si imbatte in una stampa di ciclo infinito "thread corrente non interrotto "

Non riesco a capire esattamente che differenza fa l'affermazione System.out.

risposta

5

Si noti che non sempre ottengo un ciclo infinito.

Sospetto che sia dovuto all'interlacciamento delle operazioni. Aiuta a controllare anche se il thread è vivo:

System.out.println("Current thread not interrupted!!! Alive? " + t.isAlive()); 

Se il filo non è vivo, il suo stato interrotto è falso.

ottengo un output come:

filo partire ... filo filo-0
viene interrotta !!!
thread corrente non interrotto !!! Vivo? true
thread corrente non interrotto !!! Vivo? falso
[ciclo infinito]

Credo che il primo ciclo vede il filo non interrotta perché il InterruptedException ha rimosso la bandiera - poi si ripristina la bandiera con interrupt() nel metodo run() e il filo può finire e non è vivo ancora.
Il controllo del ciclo successivo lo vede non vivo e si avvia un ciclo infinito.


Una variazione interessante può essere ottenuto aggiungendo:

System.out.println("Exiting Thread!!!"); 

Alla fine del metodo run() - fornisce un ritardo sufficientemente lungo per la condizione del ciclo da controllare tra il momento bandiera interrotto è resettato e il tempo in cui il filo muore.

-1

Come per il programma Java, la JVM terminerà una volta terminati tutti i thread non daemon.

Se non si chiama t.interrupt(), la discussione secondaria sarà attiva. Quindi, se si controlla durante il ciclo t.isInterrupted() esso restituisce true. Quindi pausa.

Se si chiama t.interrupt() mentre si esegue quell'operazione, la discussione secondaria verrà interrotta. Quindi, se controlli il ciclo t.isInterrupted() restituisce falso. Perché in Java Doc

Un'interruzione del thread ignorata perché un thread non era attivo al momento dell'interrupt verrà riflesso da questo metodo che restituisce false.

while (true) {}

Così ciclo mai rompere.

+0

questo non è giusto, isInterrupted non cancella la bandiera. –

+0

Sì. Cancella la bandiera –

+1

@SivaKumar Stai mixando 'interrupted()' con 'isInterrupted()'. Quest'ultimo non cancella la bandiera. – assylias

Problemi correlati