Недавно я обновил свой компьютер до более мощного, с четырехъядерным процессором с гиперпотоком (i7), таким образом, появилось множество реальных concurrency. Теперь я иногда получаю следующую ошибку при выходе (System.exit(0)
) приложения (с графическим интерфейсом Swing), которое я разрабатываю:
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)
Ну, учитывая, что это началось с более чем concurrency -изменимого оборудования, и оно связано с потоками, и это случается иногда, это, очевидно, какая-то вещь времени. Но проблема в том, что трассировка стека настолько коротка. Все, что у меня есть, это список выше. Он вообще не включает мой собственный код, поэтому несколько сложно догадаться, где ошибка.
Кто-нибудь испытал что-то подобное раньше? Любые идеи, как начать его решать?
Изменить: Поскольку выход из приложения 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
путем циклического перехода через массив Window.getWindows()
(он содержит бездокументальный Dialog
и т.д.), но это не имело никакого значения. Эта проблема, похоже, имеет мало общего с "чистотой" (т.е. Явным освобождением собственных ресурсов экрана перед выходом из игры). Это что-то еще, но что?
Изменить 2: Установка операции закрытия по умолчанию на EXIT_ON_CLOSE
не имеет значения. http://www.google.com/search?q=sun.java2d.Disposer.run(Disposer.java:125) находит несколько отчетов об ошибках, так что, возможно, это действительно ошибка в реализации Sun Java2D. Я мог представить, что такие ошибки могут оставаться незафиксированными в течение длительного времени, потому что они практически безвредны на практике; исключение из крюка остановки вряд ли больно кому-либо еще. Учитывая, что это происходит в приложении GUI, исключение даже не замечается, если stderr
не направлено на консоль или журнал.