2010-01-10 3 views
3

Экспозиция:Как думать о потоках Java? aka Thread.stop

Я думаю, что виртуальная машина Java является удивительной. Это гарантия безопасности байт-кода, стандартных библиотек, ... удивительны, особенно способность загружать Java-класс «на лету» и знают, что он не может разрушить виртуальную машину (удачи с * .so файлами или модули ядра).

Одна вещь, которую я не понимаю, как Java относится к Thread.stop

Я прочитал http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html , но это кажется странным по следующим причинам:

1) Управление ресурсами

В ОС Unix, если процесс подтачивает ресурсы, я могу убить -9.

2) Преломление Абстракт:

Если я начинаю вычислительно дорогую работу, и я больше не нужны вычисления, я могу убить -9 его. В этой модели потоковой передачи Java мой поток вычислений должен периодически проверять некоторый логический флаг, чтобы увидеть, нужно ли это выйти [это похоже на разрыв слоев абстракции - когда я пишу вычислительный код, я должен сосредоточиться на вычислительном коде, а не где следует распространять чеки на то, должен ли он прекращаться.

3) Безопасность Блокировка/Мониторы

Так официальная причина в том, «что нить держит блокировки/монитор, и он получает Thread.stopped объекты будут оставлены в поврежденных состояниях?» - еще , в ОС это не проблема, у нас есть обработчики прерываний. Почему в потоках Java не работают обработчики прерываний, которые работают как обработчики прерываний ОС?

Вопрос:

Очевидно, что я имею в виду Java Темы с неправильной ментальной модели. Как я должен думать о потоках Java?

Спасибо!

ответ

6

Я думаю, что важно помнить, что потоки не являются процессами. Единственное, что «собственные» потоки - это поток выполнения, поскольку все остальное потенциально может быть передано другим потокам в одном и том же процессе (пространство памяти). Остановка потока не может ничего очистить, потому что все еще может быть полностью применимо для обработки других потоков.

В процессе операционной системы ОС отслеживает все, что принадлежит процессу (память, файлы, блокировки и т. Д.) И правильно очищает, когда вы выполняете SIGKILL.

2

Вы, кажется, путаете нити и процессы.

Ресурсы (выделенная память, блокировки, дескрипторы файлов и т. Д.) Относятся к процессу не к какой-либо конкретной теме процесса. Весь смысл (и опасность) потоков заключается в том, что несколько потоков в рамках одного процесса обмениваются ресурсами.

Так что не имеет смысла говорить о каком-либо ресурсе, принадлежащем одному потоку.

ps: Я уверен, вы не можете использовать kill/kill -9, чтобы убить поток в Linux. Страница man для kill говорит, что это может убить только процесс или группы процессов.

+0

Я сбиваю с толку два.У вас есть интуиция о том, почему JVM не предоставляет Processes и предоставляет только Threads? – anon

+1

@anon: поскольку сам JVM является процессом (при запуске), а не операционной системой. Процесс не может обеспечить дополнительные процессы. Фактически, JVM действительно не предоставляет потоки - он абстрагирует потоки (если JVM не имитирует потоки), но это базовая ОС, которая предоставляет потоки процессу. –

Смежные вопросы