web-dev-qa-db-fra.com

Distinguer entre Java threads et threads OS?

Comment distinguer les threads Java Java et les threads natifs en cours d'exécution)?

Sous Linux, il y aura un processus parent pour chaque processus enfant, et ils disent que 0 est le parent de tout le processus, y aura-t-il un thread parent de tous les threads Java Java?

Comment savoir quel thread Java est lié au thread OS (si un thread Java lance un thread de processus natif).

Existe-t-il une convention de dénomination des fils Java et fils OS?

Un thread en cours d'exécution Java peut être suspendu ou supprimé d'un autre code Java?

46
karthi

Sous Linux, Java sont implémentés avec des threads natifs, donc un programme Java utilisant des threads n'est pas différent d'un programme natif utilisant des threads. Un "thread Java" est juste un thread appartenant à un processus JVM.

Sur un système Linux moderne (un utilisant NPTL), tous les threads appartenant à un processus ont le même ID de processus et ID de processus parent, mais des ID de threads différents. Vous pouvez voir ces ID en exécutant ps -eLf. La colonne PID est l'ID de processus, la colonne PPID est l'ID de processus parent et la colonne LWP est l'ID de thread (processus LightWeight). Le thread "principal" a un ID de thread identique à l'ID de processus, et les threads supplémentaires auront des valeurs d'ID de thread différentes.

Les anciens systèmes Linux peuvent utiliser l'implémentation de threads "linuxthreads", qui n'est pas entièrement compatible POSIX, au lieu de NPTL. Sur un système linuxthreads, les threads ont des ID de processus différents.

Vous pouvez vérifier si votre système utilise NPTL ou linuxthreads en exécutant la bibliothèque C du système (libc) en tant que programme autonome et en regardant sous "Extensions disponibles" dans sa sortie. Il doit mentionner soit "Native POSIX Threads Library" soit linuxthreads. Le chemin d'accès à la bibliothèque C varie d'un système à l'autre: il peut être /lib/libc.so.6, /lib64/libc.so.6 (Sur les systèmes 64 bits basés sur RedHat), ou quelque chose comme /lib/x86_64-linux-gnu/libc.so.6 (Sur systèmes modernes basés sur Debian tels que Ubuntu).

Au niveau du système d'exploitation, les têtes n'ont pas de nom; ceux-ci n'existent qu'au sein de la JVM.

La fonction pthread_kill() C peut être utilisée pour envoyer un signal à un thread spécifique, que vous pouvez utiliser pour essayer de tuer ce thread spécifique de l'extérieur de la JVM, mais je ne sais pas comment la JVM réagirait il. Cela pourrait simplement tuer la JVM entière.

69
Wyzard

Il n'y a pas de norme; cela dépend complètement de l'implémentation Java que vous utilisez. Ne mélangez pas non plus les "threads natifs" et les "processus natifs". Un processus est une entité isolée qui ne peut pas voir dans l'espace d'adressage d'autres processus. Un thread est quelque chose qui s'exécute dans l'espace d'adressage d'un processus natif et qui peut voir dans la mémoire d'autres threads du même processus.

Ce que vous voyez sous Linux est autre chose: certaines versions de Linux créent une entrée dans la table de processus pour chaque thread d'un processus parent. Ces "processus" ne sont pas de vrais processus (au sens de l'isolement). Ce sont des threads qui peuvent être répertoriés avec la commande ps. Vous pouvez trouver le processus qui les a créés en utilisant le PID parent (PPID).

8
Aaron Digulla

Un thread en cours d'exécution Java peut être suspendu ou supprimé d'un autre code Java?

En théorie oui. En pratique, les méthodes Thread.kill() et Thread.suspend() sont déconseillées car elles ne sont pas sûres sauf dans des situations très limitées. Le problème de base est que tuer ou suspendre un thread Java est susceptible de gâcher d'autres threads qui en dépendent et les structures de données partagées qu'il aurait pu être en train de mettre à jour.

Si "un autre Java" signifie une autre JVM, alors les chances de son fonctionnement sont encore moindres. Même si vous avez compris comment envoyer le signal de thread approprié, les résultats sont complètement imprévisibles . Mon pari est que la JVM "cible" planterait.

5
Stephen C

Il n'y a pas de solution générique sur la façon dont les threads Java sont mappés aux threads du système d'exploitation, le cas échéant. Chaque implémentation JVM peut le faire d'une manière différente.

Il existe également une pure implémentation de thread Java, appelée threads verts . Elle est utilisée comme solution de secours si les threads natifs ne sont pas pris en charge ou si le système n'est pas multithread à Vous ne verrez aucun fil vert sur votre système d'exploitation.

Un thread en cours d'exécution Java peut être suspendu ou supprimé d'un autre code Java?

S'ils s'exécutent sur la même machine virtuelle Java, oui, avec stop (). Mais ce n'est pas une bonne solution et peut fonctionner ou non. interrupt () permet au thread de s'arrêter en toute sécurité.

Il n'y a aucun moyen de tuer les threads en dehors de la machine virtuelle Java que je connais. Si un système d'exploitation prend vraiment en charge la suppression des threads, je ne m'attendrais pas à ce que l'application Java s'exécute correctement par la suite!

5
Hardcoded