对于一个用Java编写的多线程应用,有没有办法找到Linux上Java线程和POSIX线程之间的映射?
根据我的研究,在Java的OpenJDK中创建的每个用户线程和内核线程之间通过NPTL有1:1的对应关系。假设上面的说法是正确的,那么需要怎么做才能挂入JVM的原生线程委托机制来获取每个线程的POSIX id?
获取每个线程的id的动机是为了检查每个线程的亲和力,在运行时以指定的采样率获取每个线程的CPU时间,以及上下文切换时间。
虽然我不是一个很有经验的CC++开发人员,但为了学习的目的,我最好是用原生代码来写,而不是用一个比必要的接口更宽的通用工具。
任何帮助都是非常感激的。
Java线程的编号从 1
到 n
. 你可以买一套跑步机 Thread
(s)这样的内容(基于nadeausoftware主持的一篇文章) Java技巧:如何列出和查找线程和线程组。).
static ThreadInfo[] getAllThreadInfos() {
final ThreadMXBean thbean = ManagementFactory.getThreadMXBean();
final long[] ids = thbean.getAllThreadIds();
ThreadInfo[] infos;
if (!thbean.isObjectMonitorUsageSupported()
|| !thbean.isSynchronizerUsageSupported())
infos = thbean.getThreadInfo(ids);
else
infos = thbean.getThreadInfo(ids, true, true);
final ThreadInfo[] notNulls = new ThreadInfo[infos.length];
int nNotNulls = 0;
for (ThreadInfo info : infos)
if (info != null)
notNulls[nNotNulls++] = info;
if (nNotNulls == infos.length)
return infos;
return java.util.Arrays.copyOf(notNulls, nNotNulls);
}
public static void main(String[] args) {
for (ThreadInfo t : getAllThreadInfos()) {
System.out.printf("Thread %d, Name %s%n", t.getThreadId(),
t.getThreadName());
}
}