Gelegentliche UnterbrechungException beim Beenden einer Swing-Anwendung

Ich habe vor kurzem aktualisiert mein computer auf eine leistungsfähigere, mit einem quad-core-hyperthreading-Prozessor (i7), somit viel echte Parallelität zur Verfügung. Jetzt bin ich gelegentlich immer folgende Fehler beim beenden (System.exit(0)) ein Programm (mit Swing GUI), die ich entwickle:

Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at sun.java2d.Disposer.run(Disposer.java:125)
        at java.lang.Thread.run(Thread.java:619)

Gut, da es anfing zu passieren, mit einem mehr Parallelität-fähiger hardware, und es hat zu tun mit threads, und es passiert gelegentlich, dass es offensichtlich eine Art von timing-Sache. Aber das problem ist, dass der stack trace ist so kurz. Alle die ich habe, ist die Liste oben. Es nicht mein eigener code, so dass es etwas schwer zu erraten, wo der Fehler ist.

Hat jemand so etwas ähnliches erlebt, dies vor? Irgendwelche Ideen, wie Sie beginnen, es zu lösen?

Edit: Da das beenden einer Swing-Anwendung mit System.exit(0) werden kann "unrein", aber ich möchte nicht den main-frame zu EXIT_ON_CLOSE weil ich will, um sicherzustellen, dass es nichts kritisches vor sich geht, wenn die Anwendung beendet wird, habe ich noch einen Mechanismus, so dass es führt die main-frame-s dispose() - Methode vor dem Aufruf System.exit(0). So sollte es sein, ziemlich sauber, aber die Ausnahme passiert immer noch. Es geschieht nach den System.exit(0) genannt worden; dispose() funktioniert ohne Probleme. Das heißt, es muss aus einem shutdown-hook:

mainFrame.dispose(); //No problem! After this returns, all visible GUI is gone.
//In fact, if there were no other threads around, the VM could terminate here.
System.exit(0); //Throws an InterruptedException from sun.java2d.Disposer.run

Ich habe sogar explizit Entsorgung alle Windows, indem die Schleife durch Window.getWindows() array (es enthält herrenlos Dialogs und so), aber es machte keinen Unterschied. Dieses Problem scheint wenig zu tun zu haben, die mit "Reinheit" (also explizit die Freigabe native Bildschirm-Ressourcen vor dem beenden). Es ist etwas anderes, aber was?

Edit 2: Einstellung die default-close-operation zu EXIT_ON_CLOSE kein Unterschied gemacht. http://www.google.com/search?q=sun.java2d.Disposer.run(Entsorger.java:125) findet ein paar bug-reports, so dass dies vielleicht in der Tat ein bug in der Sonne Java2D-Implementierung. Ich könnte mir vorstellen, dass bugs wie dieser gehen kann lose für eine lange Zeit, denn Sie sind ziemlich harmlos in der Praxis; eine Ausnahme von einem shutdown-hook kaum weh tut jemand anderes. Gegeben, dass dies geschieht in einem GUI-app, die Ausnahme wird nicht einmal bemerkt, es sei denn, die stderr richtet sich an eine Konsole oder log.

InformationsquelleAutor der Frage |

Schreibe einen Kommentar