gpt4 book ai didi

java - 在 Linux 中获取 Java 线程的线程 ID

转载 作者:IT王子 更新时间:2023-10-29 00:06:32 27 4
gpt4 key购买 nike

我有一个 Java 应用程序,其中创建了一些线程(通过 new Thread())。使用 ps 我可以看到它们有不同的线程 ID(LWP 列),我想从 Java 应用程序中获取这些 ID。

在我找到的大多数与此主题相关的帖子中(例如 this one),解决方案是使用 ManagementFactory.getRuntimeMXBean().getName()

但是,使用该方法会给我主线程的 PID(即使我从其中一个线程调用它),所以它并没有真正解决我的问题。

有没有办法获取应用程序创建的每个Thread 的线程ID?

有没有可能用JNI来完成呢?如果我能以某种方式连接到一个 C 函数,我可以在其中调用 syscall(__NR_gettid),那可以解决我的问题。我真的不关心可移植性,所以我完全同意只适用于 Linux 机器的解决方案。

更新:我实际上已经通过使用 JNI 解决了我的问题。我的回答中解释了详细信息。感谢大家的建议/意见。

最佳答案

最后,我发现 JNI 方式是解决我问题的最佳方式。作为引用,我发布了代码和构建说明(基于维基百科上的 example):

负责与 C 代码接口(interface)的 Java 类 (GetThreadID.java):

public class GetThreadID {
public static native int get_tid();

static {
System.loadLibrary("GetThreadID");
}
}

负责获取线程ID的C文件(GetThread.c):

#include <jni.h>
#include <syscall.h>
#include "GetThreadID.h"

JNIEXPORT jint JNICALL
Java_GetThreadID_get_1tid(JNIEnv *env, jobject obj) {
jint tid = syscall(__NR_gettid);
return tid;
}

如何使用 GetThreadID 类的示例:

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

最后,构建指令(javah 自动生成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

关于java - 在 Linux 中获取 Java 线程的线程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11224394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com