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


von Maxim (Gast)


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?

von Peter (Gast)


Lesenswert?

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

von TestX .. (xaos)


Lesenswert?

das unterbrechen dauert ein bisle...

von Maxim (Gast)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


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:
1
private boolean stop = false;
2
private boolean done = false;
3
4
public void run() {
5
 done = false;
6
 stop = false;
7
 while(!stop) {
8
  //Tu was
9
 }
10
 done = true;
11
}
12
13
public void stopThread() {
14
 stop = true;
15
}
16
public boolean finished() {
17
 return done;
18
}

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

von Maxim (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


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...

von Michael G. (linuxgeek) Benutzerseite


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).

von Läubi .. (laeubi) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.