Thread beenden
-
Hallo,
ich habe einen Thread, der auf Eingaben von der Standardeinagbe wartet. Sobald jemand etwas eingibt und mit Enter bestätigt, gibt der Thread den eingegeben String an das Hauptprogramm und beendet sich.
Jetzt zur meiner Frage. Wie kann ich den Thread vom Hauptprogramm aus beenden, ohne, dass jemand etwas eingegeben hat? Der Thread ist in BufferedReader.readLine() blockiert...Hier eine vereinfachte Darstellung des Threads:
class InputListener implements Runnable { public void start() { myThread = new Thread(this); myThread.start(); } public void run() { input = ""; try { input = bufRead.readLine(); } catch(IOException e) { System.out.println("Error in read from std in"); } } private String input = ""; private Thread myThread = null; private BufferedReader bufRead = new BufferedReader( new InputStreamReader(System.in)); }
-
Hallo,
es gibt zwar die Methode Thread.stop(), allerdings ist diese 1) deprecated, da 2) unsicher:
http://java.sun.com/j2se/1.5.0/docs/api/index.html schrieb:
stop()
Deprecated. This method is inherently unsafe. Stopping a thread with Thread.stop causes it to unlock all of the monitors that it has locked (as a natural consequence of the unchecked ThreadDeath exception propagating up the stack). If any of the objects previously protected by these monitors were in an inconsistent state, the damaged objects become visible to other threads, potentially resulting in arbitrary behavior. Many uses of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. If the target thread waits for long periods (on a condition variable, for example), the interrupt method should be used to interrupt the wait. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.Mfg
GPC
-
Danke. Kenne die Funktion, möchte es aber vermeiden sie zu benutzen.
-
Hi
ich versteh zwar nicht genau was du machen willst.
also es gibt 2 möglichkeiten
1. den thread von ausen zu killen. nur sollte man das nicht mehr machen, da hierbei keinerlei ausnahme behandlung mehr stat findet, was zu hässlichen nebenwirkungen führen kann. Offene dateien, offene netzwerkverbindungen, nicht zurückgesetzte Locks, ...
2. du baust die einlese rotine in eine nichtblockierende um, und packst eine 'endlosschleife' drum rum. Weiter hat dein Thread ein 'kill'-Flag. Diese Flag prüfst du im Schleifen kopf und beendest somit den Thread wenn das von ausen verlagt wird. Dein haputprogramm sollte dann nach möglichkeit so lange warten bis sich der thread beendet hat. Das hat den vorteil, das du weist, wo der kill in deinem Thread einschlägt. Somit hast du als entwickler die möglichkeit, Kritische abschnitte noch zu beenden, Dateien zu schliesen, ... oder sonst was zu tun um das system in einem konsistenten zustand zu bringen, befor du den thread verlässt.
gruss
[edit] punkt 1 hat sich ja dann somit erledigt bleibt nur noch das gleiche selber zu machen. dazu brauchst du aber nichtblockierende funktionsaufrufe.
-
Threads sollen sich, wie bereits angesprochen, selber beenden, ggf. auf Anforderung. Was noch nicht angesprochen wurde ist, wie man einen blockierten Thread beendet. Hierfür ist Thread.interrupt() da. Das beendet das warten auf ein Lock oder bei manchen blocking I/O-Sachen.
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html