Ich verwende einen Thread, der kontinuierlich aus einer Warteschlange liest.Schleife in Java stoppen
Etwas wie:
public void run() {
Object obj;
while(true) {
synchronized(objectsQueue) {
if(objectesQueue.isEmpty()) {
try {
objectesQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj = objectesQueue.poll();
}
}
// Do something with the Object obj
}
}
Was ist der beste Weg, um diesen Thread zu stoppen?
Ich sehe zwei Möglichkeiten:
1 - Da Thread.stop()
veraltet ist, kann ich eine stopThisThread()
Methode implementieren, die eine n Atom-Check-Zustandsgröße verwendet.
2 - Senden Sie ein Death Event-Objekt oder etwas Ähnliches an die Warteschlange. Wenn der Thread ein Todesereignis abruft, wird er beendet.
Ich bevorzuge den 1. Weg, jedoch weiß ich nicht, wann die stopThisThread()
Methode aufrufen, da etwas auf seinem Weg zur Warteschlange sein könnte und das Stoppsignal zuerst ankommen kann (nicht wünschenswert).
Irgendwelche Vorschläge?
Hinweis, Ihre 'wait' in einer' while' Schleife sein soll, nicht ein 'if', gegen falsche Wakeups zu schützen. –
An alle, die auf Interrupt angewiesen sind: Ich möchte nur sagen, dass das Leben nie so einfach ist und es Zeiten gibt, in denen man Interrupt auf eine nicht unterbrechbare "Aktivität" aufruft und diese Aktivität den Interrupt absolut nicht wahrnimmt. Dies aus Erfahrung. Trotzdem kenne ich keinen besseren Weg ... Bitte werfen Sie einen genauen Blick auf die API: http://java.sun.com/javase/6/docs/api/index.html?java/lang/Thread .html check out die interrupt() Methode – Yaneeve
@halfwarp: +1 und +1 auf Stephen C's Antwort. Ihr * "Todesereignis" * wird eigentlich als * "Giftpille" * bezeichnet: Sie fügen einfach ein spezielles Objekt (die Giftpille) in die Warteschlange ein, das heißt "stop the thread", sobald Sie es aus der Warteschlange genommen haben. Auf diese Weise wird alles, was sich in der Warteschlange befindet, noch vor der Giftpille verarbeitet. – SyntaxT3rr0r