2010-09-16 2 views
3

Как известно, потоки Java могут взаимодействовать с использованием некоторых API-интерфейсов потоков. Но я хочу знать, как потоки Java и потоки ОС обмениваются друг с другом. Например, поток Java должен ждать, пока какой-то поток ОС завершит его выполнение и вернет некоторые результаты в этот поток Java, и он обрабатывает то же самое.Связь между потоком Java и потоками ОС

ответ

6

Многие смешивают потоки и процессы здесь, jvm - это процесс, который может порождать больше потоков. Темы - более легкие процессы, которые обмениваются памятью в рамках своего процесса. Процесс, с другой стороны, живет в его собственном адресном пространстве, что делает переключение контекста более дорогостоящим. Вы можете общаться между различными процессами с помощью механизмов IPC, предоставляемых вашей ОС, и вы можете общаться между различными потоками в рамках одного процесса из-за разделяемой памяти и других методов. То, что вы не можете есть общаться с ThreadA (ProcessA) до ThreadA (ProcessB) без прохождения через обычный старый IPC: ThreadA(ProcessA) -> ProcessA -> IPC(OS) -> ProcessB -> ThreadA(ProcessB)).

Вы можете использовать RMI для связи между двумя процессами Java, если вы хотите, чтобы «говорить» родной ОС, вы должны пойти JNI, чтобы вызывать механизмы IPC, выбранные вашей ОС по выбору.

Вы можете исправить меня здесь :)

Sidenote: Вы не можете видеть нити вашей виртуальной машины Java с менеджером процесса (до тех пор, как ваша JVM не отображает потоков для родных процессов, которые бы глупо но возможно), вам нужно использовать jps и jstack для этого.

+0

Темы - это темы. Не смешивайте нити и ** Легкие процессы **: http://en.wikipedia.org/wiki/Light-weight_process – Jonas

+0

@ Jonas yep, я не хотел вводить LWP здесь. Изменены «легкие» к «более легким» процессам, что по крайней мере менее ошибочно;) – atamanroman

0

Каждый экземпляр JVM представляет собой процесс ОС.

+1

Процесс ОС не совпадает с потоком ОС. – Jonas

+0

yup point принят – hakish

-1

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

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

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