Различение потоков Java и потоков ОС?

Как Mecki, на который указывают, launchd был бы способом пойти с этим. Существует графический интерфейс для launchd, названного Lingon, который Вы могли бы хотеть проверить, в противоположность редактированию launchd файлов вручную:

Lingon является графическим интерфейсом пользователя для создания редактирования launchd конфигурационные файлы для Mac OS X Leopard 10.5.

[надрез...]

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

46
задан Gray 24 January 2017 в 23:46
поделиться

4 ответа

В Linux потоки Java реализованы с помощью собственных потоков, поэтому программа Java, использующая потоки, ничем не отличается от собственной программы, использующей потоки. «Поток Java» - это просто поток, принадлежащий процессу JVM.

В современной системе Linux (в которой используется NPTL) все потоки, принадлежащие процессу, имеют одинаковый идентификатор процесса и идентификатор родительского процесса, но разные идентификаторы потока. Вы можете увидеть эти идентификаторы, запустив ps -eLf . Столбец PID - это идентификатор процесса, столбец PPID - это идентификатор родительского процесса, а столбец LWP - это идентификатор потока (LightWeight Process). «Основной» поток имеет идентификатор потока, который совпадает с идентификатором процесса, а дополнительные потоки будут иметь другие значения идентификатора потока.

Старые системы Linux могут использовать реализацию потоковой передачи «linuxthreads», который не полностью совместим с POSIX, вместо NPTL. В системе linuxthreads потоки имеют разные идентификаторы процесса.

Вы можете проверить, использует ли ваша система NPTL или linuxthreads, запустив системную библиотеку C (libc) как отдельную программу и посмотрев в ее выводе в разделе «Доступные расширения». Следует упомянуть либо «Нативную библиотеку потоков POSIX», либо потоки linux. Путь к библиотеке C варьируется от системы к системе: это может быть /lib/libc.so.6 , /lib64/libc.so.6 (в 64-битной RedHat -системы) или что-то вроде /lib/x86_64-linux-gnu/libc.so.6 (в современных системах на базе Debian, таких как Ubuntu).

На уровне ОС они не работают. нет имен; они существуют только в JVM.

Функция pthread_kill () C может использоваться для отправки сигнала определенному потоку, который можно использовать для попытки убить этот конкретный поток извне JVM, но я не знаю, как JVM ответит на это. Это может просто убить всю JVM.

70
ответ дан 26 November 2019 в 20:26
поделиться

Нет стандарта; это полностью зависит от используемой вами реализации Java. Также не путайте «собственные потоки» и «собственные процессы». Процесс - это изолированная сущность, которая не может видеть адресное пространство других процессов. Поток - это то, что выполняется в адресном пространстве собственного процесса и может видеть в памяти других потоков того же процесса.

То, что вы видите в Linux, - это нечто иное: некоторые версии Linux создают запись в таблица процессов для каждого потока родительского процесса. Эти «процессы» не являются реальными процессами (в смысле изоляции). Это потоки, которые можно просмотреть с помощью команды ps . Вы можете найти процесс, который их создал, используя родительский PID (PPID).

8
ответ дан 26 November 2019 в 20:26
поделиться

Нет универсального решения, как потоки Java отображаются в потоки ОС, если вообще не существует. Каждая реализация JVM может делать это по-своему.

Существует также чистая реализация потока Java, называемая зелеными потоками . Это используется как запасной вариант, если собственные потоки не работают. t или система вообще не многопоточная. Вы не увидите никаких зеленых потоков в вашей ОС.

Можно ли приостановить или убить запущенные потоки Java из другого кода Java?

Если они работают на той же самой JVM, да, с помощью stop (). Но это не очень хорошее решение и может сработать, а может и нет. interrupt () позволяет потоку безопасно отключиться.

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

interrupt () позволяет потоку безопасно отключиться.

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

interrupt () позволяет потоку безопасно отключиться.

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

5
ответ дан 26 November 2019 в 20:26
поделиться

Могут ли запущенные потоки Java быть приостановлено или убито с другой Java код?

Теоретически да. На практике методы Thread.kill () и Thread.suspend () не рекомендуются, поскольку они небезопасны, за исключением очень ограниченных ситуаций. Основная проблема заключается в том, что завершение или приостановка потока Java может испортить другие потоки, зависящие от него, и общие структуры данных, которые, возможно, находились в процессе обновления.

Если «другой код Java» предназначен для означают другую JVM, тогда шансы на ее работу еще меньше. Даже если вы выяснили, как послать соответствующий сигнал потока, результаты совершенно непредсказуемы. Я уверен, что "целевая" JVM выйдет из строя.

5
ответ дан 26 November 2019 в 20:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: