linux 编写native方法获取java线程id

在linux系统中进程是n(n>=1)个线程的集合,映射到实现层面即为task_struct的集合,其中每个task_struct代表一个线程,每个结构体有一个pid字段, 主线程的pid即为这个线程集合即进程的pid。

  • java中获取进程的pid比较简单:
String name = ManagementFactory.getRuntimeMXBean().getName();
System.out.println(name);
result: 77668@xxxxxxxxxx   // 77668即为进程id

  1. 编写java代码:GetThreadID.java
class GetThreadID {
	// 声明native方法
    public static native int get_tid();

    static {
    	// 加载动态库文件,native方法就在这里面实现的
        System.loadLibrary("GetThreadID");
    }
	// 搞了两个死循环,等下可看到两个cpu占用率为100%的线程
     public static void main(String[] args) {
         int tid = GetThreadID.get_tid();
         System.out.println("main TID=" + tid);

         new Thread(){
             @Override
             public void run() {
                 int tid = GetThreadID.get_tid();
                 System.out.println("TID=" + tid);
                 while (true){}
             }
         }.start();

         while (true){}
     }
}
  1. 实现native方法, 即编写c代码GetThreadID.c
#include <jni.h>
#include <syscall.h>
#include "GetThreadID.h"
JNIEXPORT jint JNICALL
Java_GetThreadID_get_1tid(JNIEnv *env, jobject obj) {
	// 这里发起系统调用,读取上述task_struct结构体里的pid,估计实现就一行:return current->pid // current为指向当前线程(task_struct)的指针;
	// 感觉系统调用的过程一定要好好研究下,
	// __NR_gettid: 系统调用号码宏定义,查看系统文件/usr/include/asm/unistd_64.h文件可知其为186,即下面的代码等价于:syscall(186)
    jint tid = syscall(__NR_gettid);
    return tid;
}
  1. 编译代码javac GetThreadID.java, 生成头文件:javah GetThreadID,
  2. 生成动态链接库,并把当前路径加入本地库路径里:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
gcc -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -fPIC -shared GetThreadID.c -o libGetThreadID.so
  1. 执行代码 java GetThreadID,屏幕会输出main线程和thread线程的pid,同时linux下使用top -H命令,能看到有两个cpu占用率为100%的线程。
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值