Obtenir l’ID de thread pour les threads Java sous Linux

J’ai une application Java où certains threads sont créés (via un new Thread() ). En utilisant ps je peux voir qu’ils ont des identifiants de thread différents (colonne LWP) et j’aimerais obtenir ces identifiants depuis l’application Java.

Dans la plupart des articles liés à ce sujet que j’ai trouvé (par exemple, celui-ci ), la solution consiste à utiliser ManagementFactory.getRuntimeMXBean().getName() .

L’utilisation de cette méthode me donne cependant le PID du thread principal (même si je l’appelle depuis l’un des threads), donc cela ne résout pas vraiment mon problème.

Existe-t-il un moyen d’obtenir l’identifiant de thread pour chaque Thread créé par une application?

Serait-il possible d’utiliser JNI pour y parvenir? Si d’une certaine façon je pouvais interfacer avec une fonction C où je pourrais appeler syscall(__NR_gettid) , cela pourrait résoudre mon problème. Je ne me soucie vraiment pas de la portabilité, alors je suis tout à fait d’accord avec une solution qui ne fonctionnerait que pour une machine Linux.

MISE À JOUR: J’ai effectivement résolu mon problème en utilisant JNI. Les détails sont expliqués dans ma réponse. Merci à tous pour vos suggestions / commentaires.

En fin de compte, j’ai trouvé la façon dont JNI était la meilleure pour résoudre mon problème. À titre de référence, je poste le code et crée des instructions pour ce faire (basé sur l’ exemple de Wikipedia):

Classe Java responsable de l’interface avec le code C ( GetThreadID.java ):

 public class GetThreadID { public static native int get_tid(); static { System.loadLibrary("GetThreadID"); } } 

Fichier C responsable pour obtenir l’ID de thread ( GetThread.c ):

 #include  #include  #include "GetThreadID.h" JNIEXPORT jint JNICALL Java_GetThreadID_get_1tid(JNIEnv *env, jobject obj) { jint tid = syscall(__NR_gettid); return tid; } 

Un exemple d’utilisation de la classe GetThreadID :

 class Main { public static void main(Ssortingng[] args) { int tid = GetThreadID.get_tid(); System.out.println("TID=" + tid); } } 

Et enfin, les instructions de javah ( javah génère automatiquement GetThreadID.h ):

 JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:bin/javac::") export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. javac GetThreadID.java javah GetThreadID gcc -I${JAVA_HOME}/include -fPIC -shared GetThreadID.c -o libGetThreadID.so javac Main.java java Main 

Cet article de blog propose une méthode de mappage des identifiants de threads java vers les identifiants LWP.

L’essentiel semble être que l’identifiant NLWP correspond à l’identifiant du thread Java.

Si vous voulez des identifiants de thread (identifiant de plusieurs threads s’exécutant dans le java). À partir de votre code Java, vous pouvez appeler le Thread#getId() et placer les journaux requirejs.

 Thread.currentThread().getId(); 

Pour obtenir l’identifiant du processus, vous pouvez l’essayer. LA SOURCE

  byte[] bo = new byte[100]; Ssortingng[] cmd = { "bash", "-c", "echo $PPID" }; Process p=null; try { p = Runtime.getRuntime().exec(cmd); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { p.getInputStream().read(bo); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(new Ssortingng(bo));