将Java线程映射到本机pthread

时间:2015-08-08 01:25:39

标签: java multithreading pthreads scheduling

有没有办法在Linux上找到Java线程和POSIX线程之间的映射,以便用Java编写多线程应用程序?

根据我的研究,在Java的OpenJDK中创建的每个用户线程与通过NPTL创建的内核线程之间存在1:1的对应关系。假设上面的说法是正确的,那么需要做些什么来挂钩JVM的本机线程委托机制来获取每个线程的POSIX id?

获取每个线程的id的动机是检查每个线程的亲和性,以在运行时以指定的采样率获得每线程CPU时间和上下文切换时间。

虽然不是一个非常有经验的C / C ++开发人员,但我最好还是想在本机代码中编写这个用于学习目的,而不是使用比通用接口更广泛的更通用的实用程序。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

Java线程的编号从1n。您可以获得一组运行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());
    }
}