Warum wird toter Thread aufgerufen?

Hallo liebe Experten,
seit Tagen quäle ich mich mit einer Fehlermeldung herum.
Jetzt sind mir die letzten Optionen ausgegangen.

Die Rahmenbedingungen:
Ein Panel mit dem Namen Area implementiert Runnable und startet sich selbst als Thread.
In der Methode run() gibt es eine while-Schleife, die so lange repaint(0) aufruft, bis ein Flag von außen auf false gesetzt wird, so das die Schleife verlassen und run() beendet wird.

Im Abschluss erhalte ich stets diese FehlerMeldung:

*******************

java.lang.InternalError: obsolete interface used
at sun.java2d.NullSurfaceData.getRaster(Unknown Source)
at sun.java2d.loops.OpaqueCopyAnyToArgb.Blit(Unknown Source)
at sun.java2d.loops.GraphicsPrimitive.convertFrom(Unknown Source)
at sun.java2d.loops.MaskBlit$General.MaskBlit(Unknown Source)
at sun.java2d.loops.Blit$GeneralMaskBlit.Blit(Unknown Source)
at sun.java2d.pipe.DrawImage.blitSurfaceData(Unknown Source)
at sun.java2d.pipe.DrawImage.renderSurfaceData(Unknown Source)
at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
at sun.java2d.pipe.ValidatePipe.copyImage(Unknown Source)
at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
at breakout.ui.Area.update(Area.java:400)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

*****************

Offenbar wird der Thread beendet. Welcher Prozess löst nun aber diese Fehlermeldung aus und was, liebe Experten, kann ich tun, um das zu verhindern?

Vielen Dank für die Mühe
und tschüs
Uwe

Halle liebe Experten,
es gibt neue Erkenntnisse:

Der Fehler tritt genau dann auf, wenn ich im nachhinein das Panel „Area“ aus einem Frame mit frame.removeAll() entferne.
Dies muss ich tun, um Platz für ein neues Panel zu schaffen.

Vielleicht hilft diese Erkenntnis weiter.

Danke
und tschüs
Uwe

Hi,

Der Fehler tritt genau dann auf, wenn ich im nachhinein das
Panel „Area“ aus einem Frame mit frame.removeAll() entferne.
Dies muss ich tun, um Platz für ein neues Panel zu schaffen.

Vielleicht hilft diese Erkenntnis weiter.

Klingt für mich so, als sollte das Programmdesign geändert werden.

Ohne nähere Code-Kenntnis ist schwer was zu sagen - 400 Zeilen und mehr schaut man aber natürlich auch nicht gerne durch.
Vielleicht kannst Du dem Konstruktor ein zu verwendendes Panel reinreichen, das der Thread dann benutzt, und daß dann später nicht null ist, wenn Du es entfernen willst.

Hallo Uwe,

wenn Du Deinen Thread beenden willst, dann rufe doch von deiner Thread-Instanz einfach die Methode interrupt auf bzw. setze dein beenden Flag.
Danach solltest Du mittels join auf deiner Thread-Instanz das Beenden des Threads abwarten um dann frame.removeAll() zu machen.
Wenn Du das Flag umsetzt, so heißt das noch lange nicht, dass der Thread sofort beendet wird. Unter Windows kann das manchmal noch ein paar Takte dauern.

Der Fehler kommt wahrscheinlich daher, dass der Thread noch „nachläuft“, aber aus einem anderem Thread schon frame.removeAll() aufgerufen wurde. Damit ist das entsprechende Panel vermutlich nicht mehr isDisplayable() und damit führt das ganze dann in so merkwürdige Fehlermeldungen.

PS. Nur so am Rande: interrupt() hilft NICHT bei blockierenden IO-Methoden. Da muss man anders drangehen um solche Threads zu beenden.

Gruß,
Frank

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke für die Antworten
Hallo Frank, hallo Stefan,
vielen Dank für eure Antworten.

Wahrscheinlich werde ich das Programmdesign ändern,
wenn es auch schwerfällt.

und tschüs
Uwe
http://www.haller-mtl.de/breakout/

.