最近、クアッドコア ハイパースレッディング プロセッサ (i7) を搭載したより強力なコンピューターにコンピューターを更新したため、多くの実際の同時実行が可能になりました。現在、開発中のアプリケーション (Swing GUI を使用) を終了 () すると、次のエラーが発生することがあります。System.exit(0)
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)
ええと、それがより並行性に対応したハードウェアで発生し始め、スレッドに関係しており、時折発生することを考えると、明らかにある種のタイミングの問題です. しかし問題は、スタック トレースが非常に短いことです。私が持っているのは上記のリストだけです。私自身のコードはまったく含まれていないため、バグがどこにあるかを推測するのはやや困難です。
誰かが前にこのようなことを経験したことがありますか? それを解決する方法はありますか?
編集: Swingアプリケーションを終了するのSystem.exit(0)
は「汚れている」かもしれないのでEXIT_ON_CLOSE
、アプリケーションが終了したときに重大なことは何も起こらないようにしたいので、メインフレームをに設定したくないので、それが実行されるようにメカニズムを追加しましたdispose()
を呼び出す前のメイン フレームのメソッドSystem.exit(0)
。これでかなりきれいになったはずですが、時折例外が発生します。System.exit(0)
が呼び出された後に発生します。dispose()
問題なく動作します。つまり、シャットダウン フックから来ている必要があります。
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
配列Window
をループしてすべての s を明示的に破棄しようとしましたが (所有者のないs などが含まれています)、違いはありませんでした。この問題は、「クリーンネス」(つまり、終了する前にネイティブの画面リソースを明示的に解放する) とはほとんど関係がないようです。それは別のものですが、何ですか?Window.getWindows()
Dialog
編集2:デフォルトのクローズ操作を設定してEXIT_ON_CLOSE
も違いはありません。http://www.google.com/search?q=sun.java2d.Disposer.run(Disposer.java:125)でいくつかのバグ レポートが見つかったため、これは Sun の Java2D 実装のバグである可能性があります。このようなバグは、実際にはほとんど無害であるため、長い間修正されない可能性があると想像できます。シャットダウン フックからの例外は、他の人を傷つけることはほとんどありません。stderr
これが GUI アプリで発生することを考えると、コンソールまたはログに送信されない限り、例外は認識されません。