将Java线程映射到本地pthreads上

问题描述 投票:2回答:1

对于一个用Java编写的多线程应用,有没有办法找到Linux上Java线程和POSIX线程之间的映射?

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

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

虽然我不是一个很有经验的CC++开发人员,但为了学习的目的,我最好是用原生代码来写,而不是用一个比必要的接口更宽的通用工具。

任何帮助都是非常感激的。

java multithreading pthreads scheduling
1个回答
0
投票

Java线程的编号从 1n. 你可以买一套跑步机 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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.