【问题标题】:Mapping Java threads to native pthreads将 Java 线程映射到本机 pthread
【发布时间】:2015-10-31 13:07:19
【问题描述】:

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

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

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

虽然不是一个非常有经验的 C/C++ 开发人员,但出于学习目的,我更愿意用本机代码编写此代码,而不是使用具有更广泛接口的更通用实用程序而不是必要的。

非常感谢任何帮助。

【问题讨论】:

标签: java multithreading pthreads scheduling


【解决方案1】:

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());
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多