ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
3464
3464
EMPFEHLEN
-
Guten Morgen,
ich hab ein Problem, ich kann einen Thread nicht stoppen..
Vielleicht kann mir jemand helfen?
Ausgangslage:
Code :1 2 3 4 5 6 7 8 9 10
public class main { private thread t1 = null; public void startThread(int c, String name) { if (t1 == null) { t1 = new ThreadTest(c, name); t1.start(); } } }
und die zweite Klasse ThreadTest:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
public class ThreadTest { private int counter; private string name; public ThreadTest(int c, String n) { counter = c; name = n; } public void run() { runner(counter, name); } public void runner(int c, string n) { for (int i = 0; i < c; i++) { System.out.println(n); } } }
Nun, meine Mainklasse erstellt einen neuen Thread, übergibt diesem Parameter über den Konstruktor... In diesen parametern ist eine Zählvariable, die besagt wie oft der übergebenen name ausgegeben werden soll..
Mir ist klar, dass ich keine endlosschleife in der run() methode habe, somit der Thread ended, wenn diese beendet ist.
Jedoch möchte ich nun den Thread über die Main methode vorzeitig beenden, das heisst noch während der Thread damit beschäftigt ist den namen auszugeben...
Hat jemand einen vorschlag wie man das realisieren könnte? thread.stop() soll ja nicht mehr benutzt werden..
Vielen Dank für Eure Hilfe!
Grüsse
Jim
-
10.01.09 13:12 #2
Ich mache es immer so das eine boolean (breaknow) reinkommt, diese eine gleichnamige public'e Methode bekommt der die Variables auf true setzt, und in der run() ne While kommt:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
public class ThreadTest { private int counter; private string name; //Strings schreibt man groß. private boolean breaknow; public ThreadTest(int c, String n) { counter = c; name = n; } public void run() { while(!breaknow) runner(counter, name); } private void runner(int c, string n) { for (int i = 0; i < c; i++) if(!this.breaknow) System.out.println(n); else return; } public void breaknow() { this.breaknow = true; } }
Oder so ähnlich, habs jetzt schnell hier in der Textarea geschrieben.
-
15.01.09 11:42 #3
Hallo,
die Funktion der boolsche Variable "running" gibt es in der Klasse Thread bereits.
Erspart die Variable und die Zugriffmethoden. Vgl.:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public class ThreadTest extends Thread { public static void main(String[] args) { new ThreadTest().start(); } public void run() { int i = 0; while (!isInterrupted()) { try { Thread.sleep(1000); System.out.print("."); if (i++ > 10) { System.out.println("interrupting"); interrupt(); } } catch (InterruptedException e) { e.printStackTrace(); } } } }Geändert von Franz Degenhardt (15.01.09 um 11:57 Uhr)
Denken gefärdet die Gewohnheit
-
16.01.09 23:01 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
das ist richtig. Die isInterrupted() bzw. interrupted() Methoden rufen eine native Methode in der Thread-Klasse auf.die Funktion der boolsche Variable "running" gibt es in der Klasse Thread bereits.
Erspart die Variable und die Zugriffmethoden. Vgl.:
Das Aufrufen von nativen Methoden via JNI kann mit einem gewissen overhead behaftet sein.Code :1 2 3 4 5 6
/** * Tests if some Thread has been interrupted. The interrupted state * is reset or not based on the value of ClearInterrupted that is * passed. */ private native boolean isInterrupted(boolean ClearInterrupted);
Deshalb kann es schon manchmal (aus Performancegründen) sinnvoll sein, doch ein eigenes "running / stopped" flag zu pflegen.
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
17.01.09 11:48 #5
Was macht der Thread bei Thread.interrupt()?
Ich weiß was ein I. vom Computer her ist, aber was passiert dann genau mit dem Thread? Ist das sowas wie Thread.yield()? Das in der API hat meine Frage auch nicht beantwortet. (Steht nur das es dem Thread verzögert, und wann dann ne Exception fliegt.)
-
19.01.09 18:58 #6
Sehr interessant was hinter interrupt() alles steckt, ich nehme den Tip zurück, dies als Abbruchsteuerung eines Threads zu nehmen.
Ein anderes Verhalten im Gegensatz zu "boolean running; while(running){...}" ergibt sich unter den in der API beschriebenen Umständen.
Falls der Thread z.B. gerade in einem sleep() ist, würde interrupt sofort den Thread aufwecken und eine InterruptedException auslösen. Eine Setter Methode z.B. setRunning(false) kann auch aufgerufen werden, wenn der Thread gerade schläft.
vgl.: http://java.sun.com/j2se/1.4.2/docs/...tml#interrupt()Denken gefärdet die Gewohnheit
-
Hallo! Kleiner Tipp von mir:
Bei mir sieht der Thread immer so aus:
Dabei setzte ich eine boolean-varialbe hier z.B. "laeuft = true"
Soll der Vorgang beendet werden, setzte ich sie auf "laeuft = false".
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
class clock extends Thread { public void run() { while(laeuft) { //hier steht das, was du machen willst :) try { Thread.sleep(1000); } catch(InterruptedException e) { e.printStackTrace(); } } } }
Ähnliche Themen
-
Thread Hilfe, wie beenden?
Von Fridulin im Forum .NET ArchivAntworten: 6Letzter Beitrag: 17.05.10, 11:32 -
Thread beenden
Von Raabun im Forum .NET CaféAntworten: 7Letzter Beitrag: 20.01.09, 15:38 -
Thread beenden
Von Hillkorn im Forum C/C++Antworten: 2Letzter Beitrag: 16.01.08, 21:08 -
Thread beenden
Von Winner im Forum C/C++Antworten: 10Letzter Beitrag: 07.12.07, 00:15 -
Thread beenden
Von MrPHP im Forum .NET ArchivAntworten: 1Letzter Beitrag: 12.05.04, 16:13





Zitieren

Login





