Ausnahmebehandlung in Falle von Thread.sleep und wait () - Methode im Falle von Threads
War ich versucht zu schreiben, eine Producer-Consumer-Modell (Erzeuger-thread und Verbraucher-Thread in java)
Ich Frage mich, wie man mit den InterruptedException
geworfen wird durch Thread.sleep
- Methode und die Object
Klasse wait()
Methode
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;
}
}
Dies ist ein Beispiel, das ich genommen habe, In diesem Beispiel gibt es möglicherweise keine Notwendigkeit zu kümmern, diese Ausnahme (Meine Vermutung).
, Aber ich wollte wissen was das sein könnte verschiedene Szenarien möglich, in denen wir brauchen, um diese zu bewältigen Ausnahme.
mögliche Duplikate von der Umgang mit InterruptedException in Java
Vielen Dank für die Annahme, ein guter link. Lassen Sie mich in diese Aussehen.
Vielen Dank für die Annahme, ein guter link. Lassen Sie mich in diese Aussehen.
InformationsquelleAutor Sunny Gupta | 2012-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei wichtige Dinge zu erkennen, über
InterruptedException
. First off, wenn es geworfen wird, die interrupt-flag auf derThread
deaktiviert ist. Man sollte also immer etwas zu tun:Dies ist ein sehr wichtiges Muster, denn Sie ermöglicht es anderen code, vielleicht ruft Ihnen zu erkennen, die unterbrechen auch.
Zweitens, in Bezug auf die threads, wenn Sie unterbrochen werden, sollten Sie wahrscheinlich bereinigen und beenden. Dies ist sicherlich bis zu Ihnen, dem Programmierer, aber das Allgemeine Verhalten zu beenden, und beenden Sie die operation durchgeführt wird – oft, weil das Programm versucht, auf Herunterfahren.
Schließlich mit irgendeiner exception handling, die Standard-Eclipse-Vorlage ist in der Regel die falsch Sache zu tun. Nie nur
e.printStackTrace();
die Ausnahme. Abbildung Sie heraus, was Sie wollen mit ihm: re-throw-als eine weitere Ausnahme, melden Sie es irgendwo besser, oder beenden Sie den thread/Methode/Anwendung.Vielen Dank für die Umsetzung es in einer genialen Art und Weise. Wollte nur wissen, ob wir re-throw-dies als eine weitere Ausnahme. Wird mein thread stoppen? oder Wird die Schleife tragen auf wie nichts passiert ist.
Es ist einfach Java-Semantik. Es gibt absolut keine Magie. Ihr Aufruf
sleep
oderwait
hat eine Ausnahme ausgelöst. Die Ausführung fortgesetzt, so als ob es waren einIOException
von, sagen wir,InputStream.read
.Als Marko Punkte @SAM, die
InterruptedException
ist eine normaleException
. Wenn Sie fangen es dann die Ausführung der thread geht weiter. Wenn Sie re-werfen Sie es wie einRuntimeException
und die Schleife wird nicht fangen diese Ausnahme dann der thread wird vonrun()
und der thread beendet. Standard-Ausnahme-Regeln gelten hier.Mein compiler sagt
wait()
schmeißtInterruptedException
. Ist das richtig? Kann ich vertraue meinem compiler? ;))InformationsquelleAutor Gray