Что может заставить Java продолжать работать после возврата - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть эта проблема, когда я делаю некоторые специальные взаимодействия с графическим интерфейсом. Вот моя ситуация: я использую один диалог. Я не звоню
System.exit (), но позже оставьте приложение с возвратом. Обычно JVM существует тогда, когда видит, что больше нет не-демоновские потоки работают. Но после использования этого диалога это не работает.

Я уверен на 100%, что dispose () вызывается в диалоге под вопросом, а также в основной части приложения. Я получаю это как в IDE, так и при запуске из командная строка. Я могу убить его нажатием кнопки в IDE или с помощью Ctrl-C из командной строки.

Но, конечно, было бы лучше, если бы JVM правильно завершала работу Сам перед подачей заявки.

Любые подсказки, это известная проблема? Я использую JDK 1.7, но проблема уже появилась в JDK 1.6.

С наилучшими пожеланиями

П.С .: Просто читаю: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/doc-files/AWTThreadIssues.html В прошлом были похожие проблемы. Может быть, это новый вопрос. Проблемы в прошлом были: Другие пакеты могут создавать отображаемые компоненты для внутренних нужд и никогда не превращать их в невоспроизводимые. См. 4515058 , 4671025 и 4465537 . Я попробую некоторые из них в явном наборе setVisible (false) всплывающего меню.

Ответы [ 4 ]

2 голосов
/ 27 сентября 2011

Вы уверены, что всплывающее окно уничтожено, а не просто скрыто?Я полагаю, что действие по умолчанию - скрыть, и установка операции закрытия по умолчанию на JFRAME.EXIT_ON_CLOSE может решить ее.

Другим способом диагностики проблемы может быть использование профилировщика, например, поставляемого с Netbeans.Используйте оперативный просмотр и точку отладки непосредственно перед тем, как приложение должно завершиться, и вы можете проверить живые объекты.

1 голос
/ 27 сентября 2011

Действие по умолчанию при закрытии рамки - просто скрыть ее.Поток пользовательского интерфейса все еще жив.

Если вы хотите, чтобы JVM закрывалась при закрытии создаваемого вами кадра (возможно, вашего «всплывающего окна»?), Вы должны явно сказать это, например, выполнив frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,больше документов здесь .Возможно, вам нужен только DISPOSE_ON_CLOSE в качестве defaultCloseOperation.

Другой альтернативой является добавление windowListener к кадру и самостоятельное определение правильного действия при закрытии кадра.

0 голосов
/ 14 марта 2014

У меня была такая же проблема, вызов dispose() в EventQueue.invokeLater(new Runnable() {...} решил ее для меня

0 голосов
/ 27 сентября 2011

Похоже, что по крайней мере один поток блокирует и не может ответить на прерывание.Возможно, использование .getState () в рассматриваемой теме может пролить свет на проблему.

http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState%28%29

...