有没有办法在Linux上找到Java线程和POSIX线程之间的映射,以便用Java编写多线程应用程序?
根据我的研究,在Java的OpenJDK中创建的每个用户线程与通过NPTL创建的内核线程之间存在1:1的对应关系。假设上面的说法是正确的,那么需要做些什么来挂钩JVM的本机线程委托机制来获取每个线程的POSIX id?
获取每个线程的id的动机是检查每个线程的亲和性,以在运行时以指定的采样率获得每线程CPU时间和上下文切换时间。
虽然不是一个非常有经验的C / C ++开发人员,但我最好还是想在本机代码中编写这个用于学习目的,而不是使用比通用接口更广泛的更通用的实用程序。
非常感谢任何帮助。
答案 0 :(得分:0)
Java线程的编号从1
到n
。您可以获得一组运行Thread
(s)的东西(基于由nadeausoftware Java tip: how to list and find threads and thread groups托管的文章)。
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());
}
}