Могут ли серверы приложений Java уничтожать потоки? Если да, то как?

Уничтожение потоков устарело в Java (и не реализовано в соответствии с javadoc), и прерывание его - всего лишь предложение, которое, как ожидается, должно завершиться потоком, но может и не сделать этого. (Не предоставлять какой-либо способ уничтожения потока внутри JVM - это мешающий дизайн, но мой вопрос не связан с дизайном.)

Как серверы приложений Java выгружают приложения? Могут ли они каким-то образом уничтожить потоки выгружаемого приложения? Если да, то как? Если нет, то один поток развернутого приложения с бесконечным циклом может отключить весь сервер приложений без какой-либо возможности вмешаться?

Извините, что я не пишу тестовые примеры для этого, но я хотел бы знать, что на самом деле там происходит.

2 ответа

Решение

Вам не разрешено создавать свои собственные потоки внутри сервера ejb.

Нередко появляются потоки в веб-контейнере (например, в tomcat), хотя вы должны тщательно обдумать это и быть уверенным в управлении жизненным циклом этих потоков.

Отказ от какого-либо способа уничтожения потока внутри J VM - это мешающий дизайн, но мой вопрос не связан с дизайном.

Поскольку на ваш реальный вопрос ответили, я собираюсь обратиться к приведенному выше предложению.

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

Проблема заключается в том, что вы просто не можете безопасно завершать потоки, которые могут изменять общие данные неатомарным образом или могут синхронизироваться с другими, используя механизм ожидания / уведомления. Если вы реализуете уничтожение потоков в этом контексте, вы получите частичные обновления структур данных и другие потоки, ожидающие уведомлений, которые никогда не поступят. Другими словами, уничтожение одного потока может оставить остальную часть приложения в неопределенном и поврежденном состоянии.

Другие языки / библиотеки (например, C, C++, C#), которые позволяют уничтожать потоки, страдают от тех же проблем, которые я описал выше, даже если соответствующие спецификации / учебники не дают ясного объяснения. Несмотря на то, что можно убивать потоки, вы должны быть очень осторожны при разработке и реализации всего приложения, чтобы сделать это безопасно. Вообще говоря, это слишком сложно, чтобы получить права.

Итак (гипотетически), что нужно сделать, чтобы убить поток в Java? Вот несколько идей:

  • Если в вашей JVM реализована функция Isolates, вы можете запустить вычисление, которое, возможно, захотите убить в дочернем Isolate. Проблема заключается в том, что правильно реализованный изолят может обмениваться данными с другими изолятами только путем передачи сообщений, и они, как правило, будут намного дороже в использовании.

  • Проблему общего изменяемого состояния можно решить, полностью запретив мутацию или добавив транзакции в модель выполнения Java. Оба из них в корне изменили бы Java.

  • Проблему ожидания / уведомления можно решить, заменив ее механизмом рандеву или передачи сообщений, который позволяет "другому" потоку быть информированным о том, что поток, с которым он взаимодействовал, исчез. "Другой" поток все равно должен быть закодирован для восстановления после этого.

РЕДАКТИРОВАТЬ - В ответ на комментарии.

Mutex тупик не был проблемой для thread.destroy() так как это было разработано, чтобы выпустить (сломать) все мьютексы, принадлежащие потоку, который был уничтожен. Проблема заключалась в том, что не было никаких гарантий, что структура данных, защищенная мьютексом, будет в нормальном состоянии после снятия блокировки.

Если я правильно понимаю историю этой темы, Thread.suspend(), Thread.delete() и так далее действительно вызывало проблемы в реальных приложениях Java 1.0. И эти проблемы были настолько серьезными и настолько сложными для разработчиков приложений, что разработчики JVM решили, что лучший способ - отказаться от методов. Это было бы нелегким решением.

Теперь, если вы смелы, вы можете использовать эти методы. И в некоторых случаях они могут быть в безопасности. Но построение приложения на устаревших методах не является разумной практикой разработки программного обеспечения.

Другие вопросы по тегам