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?
risposta
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-
la pagina non viene trovata. Potresti aggiornare il tuo post? – Laurence
http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs- –
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.
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.
Il InterruptedException
viene generato di solito quando si interrompe un sonno.
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
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ò.
Le asserzioni in Java sono [disattivate per impostazione predefinita] (http://stackoverflow.com/a/2758645/1143274). Quindi è meglio lanciare una 'RuntimeException'. –
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.
- 1. InterruptedException da Thread.sleep()
- 2. Java: LockSupport.parkNanos vs Thread.sleep (...)
- 3. Thread.Sleep alternativo in Java
- 4. Implementazione Java Thread.sleep()
- 5. Java - Thread.sleep nel metodo principale
- 6. Perché InterruptedException è un'eccezione controllata?
- 7. Thread.sleep() non restituisce mai
- 8. Quando è ragionevole usare Thread.Sleep()?
- 9. La causa di InterruptedException
- 10. Problema di prestazioni Java con Thread.sleep()
- 11. CountDownLatch InterruptedException
- 12. Perché Java non lancia un'eccezione quando si divide per 0,0?
- 13. Guava: Throwables.propagate e InterruptedException
- 14. chiama Thread.sleep() dal contesto sincronizzato in Java
- 15. Qual è equivalente a .NET di InterruptedException (Java)?
- 16. Java: perché Thread.sleep() e yield() sono statici?
- 17. mvn Sonar: sonar lancia un'eccezione mentre si fa la scansione AST Java
- 18. Qual è l'equivalente di Thread.sleep() di Java in JavaScript?
- 19. E 'sempre una cassetta di sicurezza di ignorare sempre InterruptedException chiamando sonno Discussione() in Java
- 20. Thread.sleep vs. TimeUnit.SECONDS.sleep
- 21. Uso accettabile di Thread.Sleep()
- 22. Come funziona Thread.sleep() quando chiamato da più thread
- 23. Thread.sleep in attori Scala
- 24. asincrono Thread.Sleep()
- 25. ManualResetEvent vs Thread.Sleep
- 26. Python: Java lancia equivalente in pitone
- 27. CPU consumata quando thread sta dormendo utilizzando Thread.sleep
- 28. Crash quando lancia CFArrayRef a NSArray
- 29. Java wait and notify fa deadlock
- 30. La chiamata a Thread.interrupt() prima di Thread.join() fa sì che il join() lanci immediatamente una InterruptedException?
http://stackoverflow.com/questions/1024651/do-i-have-to-worry-about-interruptedexceptions-if-i-dont-interrupt-anything-myse –
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
Questo articolo può aiutare a comprendere questo meccanismo: [Cosa fai con InterruptedException?] (Http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256