找到linux获得java线程ID的方法

来源:互联网 发布:科瑞达软件官网 编辑:程序博客网 时间:2024/05/24 23:16

网上大部分资料提供找到线程ID的方法多限于java程序内部线程对象的ID,而不是整个系统的线程ID,本来寄希望于 线程ID=进程ID+内部线程对象ID, 但实验结果表明这个公式不成立,后来师兄说在windows下内部线程对象ID与线程ID有一一对应的关系,在linux下这种关系不固定,那就再换一种方式吧。


终于找到一种在linux下可以获得java程序执行当前任务的线程ID,方法如下

1.编写系统调用C文件,实现gettid()方法

2.使用JNI用实现java对C的调用,即可在java中直接获得gettid()返回当前线程ID 


具体步骤

1.GetTid.java

public class GetTid {
static
{
System.loadLibrary("gettid");
}
public native int gettid();//本地方法声明
public int getthreadId() 
{
return gettid();
}
}

--------------------------------------------------------------------------

2.利用JNI编译此JAVA文件,生成GetTid.h(具体的方法可以参考我的另一篇博文——JNI调用)


3. gettid.c

#include <sys/syscall.h>
#include <sys/types.h>
#include <getopt.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <GetTid.h>

#define SYSCALL_NAME"gettid"

#ifndef _NR_gettid
#define _NR_gettid 224
#endif


JNIEXPORT int JNICALL Java_GetTid_gettid
(JNIEnv *env, jobject obj)
{
int sys_ret;
sys_ret=(pid_t)syscall(_NR_gettid);//使用系统调用获得tid,虽然在linux终端中man gettid() 函数有使用方法,但是具体的实现还是要由自己来完成
printf("%d ",sys_ret);
return sys_ret;
}

--------------------------------------------------------------------------

4.makefile

libgettid.so:gettid.o
gcc -Wall -rdynamic -shared -o libgettid.so gettid.o
gettid.o:gettid.c GetTid.h
gcc -Wall -c gettid.c -I./ -I/usr/include -I/home/tina/workspace/tenantmanager/src/aspect -I/home/tina/jdk1.6.0_25/include -I/home/tina/jdk1.6.0_25/include/linux

---------------------------------------------------------------------------

5.编译生成.so文件,

再将该文件拷到/usr/lib下,

然后更改系统环境变量文件/etc/profile

添加export LD_LIBRARY_PATH=/home/usr/lib


经过这些步骤可以在其他的java程序中调用gettid()函数。


建议:我在实现过程中出现很多错误,一部分是JNI方面的,另一部分是关于编译环境的,建议大家使用在linux环境下使用eclipse+CDT 编译C或JAVA,因为复杂的项目,文件之间有依赖性,单用javac 或GCC无法很好的处理依赖性,而eclipse在这一方面处理的很好,大家可以借用。


在此,多谢师兄们还有老公的帮助。


原创粉丝点击