¿Distinguiendo entre los hilos de Java y los hilos del sistema operativo?

¿Cómo puedo distinguir la ejecución de subprocesos Java y subprocesos nativos?

En Linux, habrá un proceso principal para cada proceso hijo, y dicen que 0 es el padre de todo el proceso, ¿habrá un hilo principal de todos los hilos de código bifurcados?

¿Cómo puedo saber qué hilo de Java está relacionado con el hilo del sistema operativo (si un hilo de Java forma un hilo de proceso nativo).

¿Hay alguna convención de nomenclatura de subprocesos Java y subprocesos de sistema operativo?

¿Puede un hilo Java en ejecución suspenderse o eliminarse de otro código Java?

En Linux, los subprocesos de Java se implementan con subprocesos nativos, por lo que un progtwig de Java que utiliza subprocesos no es diferente de un progtwig nativo que utiliza subprocesos. Un “hilo de Java” es solo un hilo que pertenece a un proceso de JVM.

En un sistema Linux moderno (uno que usa NPTL), todos los subprocesos que pertenecen a un proceso tienen el mismo ID de proceso e ID de proceso principal, pero diferentes identificadores de subprocesos. Puede ver estos ID ejecutando ps -eLf . La columna PID es la ID del proceso, la columna PPID es la ID del proceso principal y la columna LWP es la identificación del subproceso (LightWeight Process). El subproceso “principal” tiene una Id. De subproceso que es la misma que la ID de proceso, y los subprocesos adicionales tendrán diferentes valores de Id. De subproceso.

Los sistemas Linux más antiguos pueden usar la implementación de subprocesos “linuxthreads”, que no es totalmente compatible con POSIX, en lugar de NPTL. En un sistema linuxthreads, los subprocesos tienen diferentes ID de proceso.

Puede verificar si su sistema está utilizando NPTL o linuxthreads ejecutando la biblioteca C (libc) del sistema como un progtwig independiente y buscando en “Salida disponible” en su salida. Debería mencionar “Native POSIX Threads Library” o linuxthreads. La ruta a la biblioteca C varía de un sistema a otro: puede ser /lib/libc.so.6 , /lib64/libc.so.6 (en sistemas basados ​​en RedHat de 64 bits), o algo así como /lib/x86_64-linux-gnu/libc.so.6 (en sistemas modernos basados ​​en Debian como Ubuntu).

En el nivel del sistema operativo, los temas no tienen nombres; esos existen solo dentro de la JVM.

La función C de pthread_kill() se puede usar para enviar una señal a un hilo específico, que podría usar para intentar eliminar ese hilo específico desde fuera de la JVM, pero no sé cómo respondería la JVM. Podría matar a toda la JVM.

No hay un estándar; esto depende completamente de la implementación de Java que estés usando. Además, no mezcle “hilos nativos” y “procesos nativos”. Un proceso es una entidad aislada que no puede ver en el espacio de direcciones de otros procesos. Un hilo es algo que se ejecuta en el espacio de direcciones de un proceso nativo y que puede verse en la memoria de otros hilos del mismo proceso.

Lo que se ve en Linux es algo más: algunas versiones de Linux crean una entrada en la tabla de procesos para cada subproceso de un proceso principal. Estos “procesos” no son procesos reales (en el sentido de aislamiento). Son hilos que se pueden enumerar con el comando ps . Puede encontrar el proceso que los creó utilizando el PID principal (PPID).

¿Puede un hilo Java en ejecución suspenderse o eliminarse de otro código Java?

En teoría, sí. En la práctica, los Thread.kill() y Thread.suspend() están en desuso porque no son seguros excepto en situaciones muy limitadas. El problema básico es que matar o suspender un hilo de Java es probable que arruine otros hilos que dependen de él, y las estructuras de datos compartidas que podría haber estado en medio de la actualización.

Si “otro código Java” significa otra JVM, entonces las posibilidades de que funcione sean aún menores. Incluso si descubrió cómo enviar la señal de subproceso relevante, los resultados son completamente impredecibles. Mi apuesta es que la JVM “objective” se bloquee.

No existe una solución genérica de cómo se correlacionan los hilos de Java con los hilos del sistema operativo, si es que lo hacen. Cada implementación de JVM puede hacerlo de una manera diferente.

También hay una implementación pura de subprocesos de Java, llamada subprocesos verdes . Esto se usa como una alternativa si los subprocesos nativos no son compatibles o el sistema no es multihilo en absoluto. No verá ningún hilo verde en su sistema operativo.

¿Puede un hilo Java en ejecución suspenderse o eliminarse de otro código Java?

Si se están ejecutando en la misma JVM, sí, con stop (). Pero esa no es una buena solución y puede funcionar, o no. interrupt () permite que el hilo se cierre de manera segura.

No hay forma de matar hilos fuera de la JVM que conozco. Si un sistema operativo realmente admite la eliminación de subprocesos, ¡no esperaría que la aplicación Java se ejecute correctamente después!