www.mikrocontroller.net

Forum: PC-Programmierung JAVA: thread.interrupted() false trotz thread.interrupt()


Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich erstelle ein Thread mit z.B.

Thread thread = new Thread();

und starte ihn.
Dann unterbreche ich diesen so

thread.interrupt();

und erhalte direkt in der nächsten Zeile von

thread.interrupted()

trotzdem false. Warum das?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kommt darauf ann was der thread in dem moment macht, wenn er auf eine 
IO-Resource wartet kann es eine weile dauern.

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das unterbrechen dauert ein bisle...

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, danke. Bin auch darauf gekommen und habe eine kleine Warteschleife 
programmiert, aber die war wohl zu kurz.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maxim schrieb:
> und starte ihn.
> Dann unterbreche ich diesen so
>
> thread.interrupt();

ACHTUNG Bitte die Java Doku über Thread lesen!
thread.interrupt() entläßt den Thread nur aus einer "blokierenden" 
Status!

stop() würde ihn beenden ist aber deprecated weil es dazu führen kann 
das Objekte nicht ordnungsgemäß hinterlassen werden!

Der mögliche Weg ist:
private boolean stop = false;
private boolean done = false;

public void run() {
 done = false;
 stop = false;
 while(!stop) {
  //Tu was
 }
 done = true;
}

public void stopThread() {
 stop = true;
}
public boolean finished() {
 return done;
}

Auf den Thread warten tut man dann mit *join()* wenn man das braucht!

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für was ist dann eigentlich interrupt() gut? Aus "wait" kommt der Thread 
durch notify() und aus "sleep" erst nach der vorgegebenen Zeit oder 
durch interrupt(). Aber das kann ja nicht der einzige Zweck sein.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maxim schrieb:
> Für was ist dann eigentlich interrupt() gut? Aus "wait" kommt der Thread
> durch notify() und aus "sleep" erst nach der vorgegebenen Zeit oder
> durch interrupt(). Aber das kann ja nicht der einzige Zweck sein.

Hast du dir doch eigentlich schon selber beantwortet ;)
Stell dir vor du hast ein Thread.sleep(10000); oder wait() gemacht.
Jezt trit aber irgend ein Ereignis auf (z.B. schließen eines Fensters) 
wodurch ein warten überflüssig werden würde, dein Thread, die Java VM 
und die Recourcen leben jezt aber weiter, und dein Thread kommt aus 
diesem blokierendem Zustand nichtmehr heraus... ob das auch auswirkungen 
auf Blokierendes lesen von InputStreams hat hab ich noch nie versucht zu 
ergründen, wäre aber auch so eine Sache wo man gff. nicht mehr 
"rauskommt".

Aber wie gesagt, sowas ist eigentlich sehr unschön...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maxim schrieb:
> Ich erstelle ein Thread mit z.B.
>
> Thread thread = new Thread();
>
> und starte ihn.
> Dann unterbreche ich diesen so
>
> thread.interrupt();

Das macht man so nicht. API-Dokumentation lesen und vor allem darueber 
klar werden, welche Methoden offiziell veraltet sind (so wie diese).

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. schrieb:
> Das macht man so nicht. API-Dokumentation lesen und vor allem darueber
> klar werden, welche Methoden offiziell veraltet sind (so wie diese).
Meintest du dich jezt selbst damit? ;)

http://java.sun.com/javase/6/docs/api/java/lang/Thread.html

Weder interrupt() noch isInterrupted() sind veraltet/deprecated.

> Das macht man so nicht.
Machmal schon, steht so in der API wann und ich habe oben auch schon 
erwähnt das man normalerweise nicht darauf angewiesen ist und es 
vermeiden sollte.
Also manchmal einfach tief durchatmen bevor man voreilig in die Bresche 
springt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.