80

Quando fa Thread.sleep di Java lancia InterruptedException? È sicuro ignorarlo? Non sto facendo nessun multithreading. Voglio solo aspettare qualche secondo prima di riprovare.Quando fa Thread.sleep di Java lancia InterruptedException?

+2

http://stackoverflow.com/questions/1024651/do-i-have-to-worry-about-interruptedexceptions-if-i-dont-interrupt-anything-myse –

+1

Dipende in che senso intendi "ignorare" . 'InterruptedException' è un'eccezione catturata, quindi non puoi compilare a meno che non gestisci o dichiari questo tipo di eccezione su qualsiasi metodo che unisce o dorme un' Thread', o chiama 'wait()' su 'Object'. – 8bitjunkie

+1

Questo articolo può aiutare a comprendere questo meccanismo: [Cosa fai con InterruptedException?] (Http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

risposta

24

In generale, NON si deve ignorare l'eccezione. Date un'occhiata al seguente documento:

Non ingoiare interrupt

volte gettando InterruptedException è non è un'opzione, come ad esempio quando un compito definito da Runnable chiama un metodo di interrompibile. In questo caso, non puoi ribaltare InterruptedException, ma anche tu non vuoi fare nulla. Quando un metodo di blocco rileva un'interruzione e genera InterruptedException, cancella lo stato interrotto. Se rilevi InterruptedException ma non riesci a ricrearlo, dovresti conservare la prova che l'interruzione si è verificata in modo che il codice più in alto sullo stack di chiamate possa apprendere l'interruzione e rispondere ad esso se lo desidera. Questa attività viene eseguita chiamando interrupt() per "reinterrompere" il thread corrente , come mostrato nel Listato 3. Per lo meno, ogni volta che si cattura InterruptedException e non rilanciarlo, reinterrupt il thread corrente prima di tornare.

public class TaskRunner implements Runnable { 
    private BlockingQueue<Task> queue; 

    public TaskRunner(BlockingQueue<Task> queue) { 
     this.queue = queue; 
    } 

    public void run() { 
     try { 
      while (true) { 
       Task task = queue.take(10, TimeUnit.SECONDS); 
       task.execute(); 
      } 
     } 
     catch (InterruptedException e) { 
      // Restore the interrupted status 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

vedere l'intera carta qui:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-

+0

la pagina non viene trovata. Potresti aggiornare il tuo post? – Laurence

+1

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs- –

4

Un modo solido e facile da gestire nel codice threaded singolo sarebbe B e per catturarlo e recuperarlo in una RuntimeException, per evitare di doverlo dichiarare per ogni metodo.

9

La newsletter di Java Specialists (che posso raccomandare senza riserve) ha un interesting article on this e come gestire lo InterruptedException. Vale la pena leggere e digerire.

-4

Il InterruptedException viene generato di solito quando si interrompe un sonno.

+11

Questo è sbagliato, in quanto non è il sonno stesso che viene interrotto, ma il Thread lo esegue. Interrotto è uno stato del filo. Fa semplicemente uscire il metodo di sonno. – ubuntudroid

23

Se viene generata una InterruptedException, significa che qualcosa desidera interrompere (di solito terminare) quella discussione. Questo è innescato da una chiamata al metodo threads interrupt(). Il metodo wait rileva questo e genera un InterruptedException in modo che il codice catch possa gestire immediatamente la richiesta di terminazione e non deve attendere fino al momento specificato.

Se lo si utilizza in un'applicazione a thread singolo (e anche in alcune applicazioni multi-thread), quell'eccezione non verrà mai attivata. Ignorandolo avendo una clausola di cattura vuota non lo consiglierei. Il lancio di InterruptedException cancella lo stato interrotto del Thread, quindi se non gestito correttamente tali informazioni vengono perse. Quindi propongo di eseguire:

} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // code for stopping current task so thread stops 
} 

Quali set che lo stato di nuovo. Dopodiché, termina l'esecuzione.Questo sarebbe un comportamento corretto, anche difficile mai usato.

Quale potrebbe essere migliore è quello di aggiungere un:

} catch (InterruptedException e) { 
    assert false; 
} 

dichiarazione al blocco catch. Ciò significa fondamentalmente che non deve mai accadere. Quindi, se il codice viene riutilizzato in un ambiente in cui potrebbe accadere, si lamenterà di ciò.

+4

Le asserzioni in Java sono [disattivate per impostazione predefinita] (http://stackoverflow.com/a/2758645/1143274). Quindi è meglio lanciare una 'RuntimeException'. –

0

Metodi come sleep() e wait() della classe Thread potrebbero generare un valore InterruptedException. Ciò accadrà se altri thread desiderano interrompere lo thread che è in attesa o inattivo.

Problemi correlati