2016-05-12 35 views
2

Ich wollte eine Berechnung starten und beenden sie auf Benutzer Abbrechen. Sie sagen, dass das Aufrufen von Thead.stop() alle Monitore entriegelt und die Ausnahme ThreadDeath auslöst. Dies bedeutet, dass finally immer noch aufgerufen wird.Thread-Lebenszyklus auf ThreadDeath

Angenommen, ich interessiere mich nicht für die Sperren, sondern möchte die Ressourcen freigeben, die bisher zugewiesen wurden. Ich möchte, dass der Canceller weiß/wartet, bis der Thread seine Zuweisungen beendet hat. Angenommen, der final-Abschnitt hat im final-Abschnitt eine Endlosschleife. Wird thread.join zu diesem Thread erfolgreich sein?

+4

Tun Sie es einfach nicht. –

Antwort

1

Es hängt davon ab, welchen Code der Thread an dem Punkt ausführt, an dem ThreadDeath ausgelöst wird. Wenn Ihr Thread zum Beispiel gestoppt wird, während er zufällig den oberen Rand eines finally-Blocks erreicht, können Sie eine Situation haben, in der ThreadDeath ausgelöst wird, nachdem der Block eingegeben wurde, aber bevor die Ressource geschlossen wird abgeschlossen.

Es wäre viel weniger fehleranfällig sein Unterbrechung zu verwenden, die den Faden volle Kontrolle haben unterbrochen lässt darüber, wie er beendet und schließt seine Ressourcen.

+0

AFAIK, können Sie nur warten Threads unterbrechen, nicht diejenigen, die Berechnung in der Hitze. –

+0

@LittleAlien: Ja, der Thread, der unterbrochen wird, muss entweder sein unterbrochenes Flag überprüfen oder schlafen oder warten. –

+0

@LittleAlien: Um zu verdeutlichen, ich sage nur, dass dieser Randfall existiert, wo Sie nicht in allen Fällen absolute Sicherheit haben können. –