La gestion des exceptions en cas de Thread.dormir et d'attendre() la méthode dans le cas de Threads
J'étais en train d'écrire un Producteur de modèle de Consommation (thread Producteur et Consommateur Thread en java)
Je me demandais comment gérer la InterruptedException
est levée par Thread.sleep
méthode et la Object
de la Classe wait()
méthode
package producerconsumer;
import java.util.ArrayList;
public class Consumer implements Runnable {
ArrayList<Integer> container;
@Override
public void run() {
while(true){
System.out.println("Consumer Thread Running");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(null==container){
System.out.println("container is null");
}
//Removing values from Arraylist
synchronized (container) {
if(container.size()==0){
try {
container.wait();
} catch (InterruptedException e) {
//How to tackle this exception
e.printStackTrace();
}
}
Integer removedInteger = container.remove(container.size()-1);
System.out.println("removedInteger..."+removedInteger);
}
}
}
public void setContainer(ArrayList<Integer> container) {
this.container = container;
}
}
C'est un exemple que j'ai pris, Dans cet exemple il n'y a aucun besoin de prendre soin de ces exception (Mon Hypothèse).
Mais je voulais savoir quelles pourraient être les différents scénarios possibles dans lesquels nous devons traiter cette exception.
- double possible de Gestion InterruptedException en Java
- Merci pour suggérer un bon lien. Permettez-moi d'examiner cette question.
Vous devez vous connecter pour publier un commentaire.
Il y a deux choses importantes à réaliser sur la
InterruptedException
. Tout d'abord, quand il est jeté l'interruption drapeau sur laThread
est désactivée. Donc, vous devriez toujours faire quelque chose comme:C'est très important patron, car il permet à d'autres de code qui pourrait être l'appel de la vôtre pour détecter l'interruption ainsi.
Deuxièmement, en termes de threads, s'ils sont interrompus, ils doivent probablement de nettoyage et de cesser de fumer. C'est certainement à vous, le programmeur, mais le comportement général est de mettre fin et de cesser de l'opération en cours – souvent parce que le programme est en train d'essayer d'arrêter.
Enfin, avec toute la gestion des exceptions, la valeur par défaut de l'Éclipse de modèle est généralement le mal chose à faire. Jamais
e.printStackTrace();
l'exception. Comprendre ce que vous voulez faire avec elle: re-jeter comme une autre exception, connectez-vous quelque chose de mieux, ou de quitter le thread/méthode/de l'application.sleep
ouwait
a déclenché une exception. L'exécution se poursuit comme si il s'agissait d'uneIOException
à partir de, disons,InputStream.read
.InterruptedException
est normalException
. Si vous l'attraper, puis l'exécution de votre thread continue. Si vous re-jeter aussi unRuntimeException
et la boucle n'est pas visé par cette exception, le thread sera de retour à partir derun()
et le fil va s'arrêter. Standard exception règles s'appliquent ici.wait()
jamais jetteInterruptedException
. Est-ce exact? Puis-je faire confiance à mon compilateur? ;))Object.wait()
ne jeterInterruptedException
. Peut-être que la méthode renvoieException
ou quelque chose qui est de le masquer @Gracchus?