java获取linux线程id_找到linux获得java线程ID的方法 | 学步园

网上大部分资料提供找到线程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在这一方面处理的很好,大家可以借用。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值