网上大部分资料提供找到线程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
#include
#include
#include
#include
#include
#include
#include
#include
#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在这一方面处理的很好,大家可以借用。
在此,多谢师兄们还有老公的帮助。