Java убивает потоки демона при перезагрузке апплета - PullRequest
1 голос
/ 20 апреля 2011

Я знаю, что все потоки демона должны быть уничтожены, если нет другого потока, не являющегося демоном.Я разрабатываю апплет, который получает данные от статических объектов.Эти статические объекты загружают некоторые данные с удаленного сервера в поток демона.Несколько апплетов могут обращаться к одним и тем же данным, поэтому нет смысла запускать поток для каждого апплета.Проблема в том, когда я перезагружаю страницу.Апплеты перезагружаются, и они регистрируются в этих статических объектах, и все будет хорошо, за исключением того, что тогда JVM убивает потоки демона.

Может быть, я объясню шаг за шагом:

  1. Апплет загружаетсяон регистрируется в статическом объекте, который предоставляет данные.
  2. Статический объект запускает поток демона.
  3. Перезагрузка страницы.
  4. Апплет выгружается (вызываются stop () и destroy ())
  5. Создается новый экземпляр апплета, который регистрируется в статическом объекте.
  6. JVM создает ThreadDeath в потоке демона, и связь прекращается.

На мой взгляд, шаг6 должно быть после 4 и до 5. Я что-то упустил?

Обходное решение, которое я разработал, - это некоторое время спать перед регистрацией в статическом объекте, чтобы позволить JVM уничтожать демонов, а затем автоматически создается демон, но это толькообходной путь.Есть ли какое-нибудь лучшее решение?

Ответы [ 2 ]

0 голосов
/ 09 октября 2012

Я бы не рекомендовал делиться фоновыми потоками между апплетами, но если вы настаиваете, вы можете сделать следующее:

Вы можете перехватить ThreadDeath, переопределив Thread.setDefaultUncaughtExceptionHandler, чтобы не пропустить его. Затем вы можете перезапустить новую ветку deamon из этого обработчика, чтобы заменить убитую.

Вы должны убедиться, что вы не используете синхронизированный на общих членах в фоновых потоках, так как ваш поток может быть остановлен в середине синхронизированного блока, как описано в Thread.stop (плагин Java использует Thread.stop для уничтожения ваши темы).

Обратите внимание, что если у вас есть как минимум 2 апплета, открытых на 2 разных вкладках, перезагрузка одного из них не заставит JVM уничтожить ваш поток. Флаг демона, похоже, не оказывает никакого влияния на среду апплета.

0 голосов
/ 20 апреля 2011

Почему бы вам не прервать поток демона в stop() или destroy(), чтобы прояснить ситуацию.

...