Подтвердить что ты не робот

Различия между потоками Java и потоками ОС?

Как отличить исполняемые потоки Java и собственные потоки?

В Linux будет родительский процесс для каждого дочернего процесса, и они говорят, что 0 является родительским для всего процесса, будет ли родительский поток всех разветвленных потоков Java?

Как узнать, какой поток Java связан с потоком ОС (если поток Java называет собственный поток процесса).

Есть ли какое-либо соглашение об именах потоков Java и потоков ОС?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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