czs*_*czs 5 java multithreading agent jvmti
我正在研究JVMTI代理,我想在方法输入和退出时识别相同的线程.我能够获得线程名称,但这还不够.
想象一下,你有一个像这样的方法:
public class Main {
public static void myMethod() {
System.out.println("doing something as " + Thread.currentThread().getName());
Thread.currentThread().setName("SomethingDifferent");
System.out.println("doing something as same thread " + Thread.currentThread().getName());
}
}
Run Code Online (Sandbox Code Playgroud)
因此,输入此方法将有一个名称,并退出此线程具有不同的名称.
当像这样使用JVMTI时:
static void JNICALL callback_on_method_entry(jvmtiEnv *jvmti, JNIEnv* env,
jthread thread, jmethodID method)
{
...
(*jvmti)->GetThreadInfo(jvmti, thread, &info);
...
}
static void JNICALL callback_on_method_exit(jvmtiEnv *jvmti, JNIEnv *env, jthread thread, jmethodID method, jboolean was_popped_by_exception, jvalue return_value)
{
...
(*jvmti)->GetThreadInfo(jvmti, thread, &info);
...
}
Run Code Online (Sandbox Code Playgroud)
每个info都会报告不同的线程名称,我希望它们具有相同的标识符.
如何获得线程的相同标识符?
一种解决方案是获取referenced Thread(tid)的字段值.怎么做 ?我可以通过堆迭代但我无法得到字段名称.
我终于找到了另一个简单的解决方案:
因为进入/退出回调在同一线程中运行,所以可以使用pthread_self()它并将其强制转换为unsigned int. 它tid与您在java中找到的不一样,但是尽管名称发生了变化,您仍将获得线程的唯一编号。