2015-08-08 34 views
1

有没有发现Java线程和POSIX线程在Linux之间的映射用Java编写的多线程应用程序的方法吗?映射Java线程本地并行线程

从我的研究中,有一个1:通过NPTL Java的的OpenJDK和内核线程创建的每个用户线程之间的一一对应。假设上述内容是正确的,那么需要做什么才能挂钩到JVM的本地线程委托机制以获取每个线程的POSIX标识?

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

虽然不是一个非常有经验的C/C++开发者,我想最好喜欢写这本机代码学习之用,而不是使用更为通用的工具比什么是必要更宽的界面。

任何帮助,非常感谢。

+0

也许你可以确定属于正在运行的java进程的线程。 – Tarik

+0

http://stackoverflow.com/a/1888489/1901067 – David

回答

0

Java线程编号从1n。你可以得到一组具有类似(basedo由nadeausoftware Java tip: how to list and find threads and thread groups主办的文章)运行Thread(S)的。

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