我是靠谱客的博主 无心画板,最近开发中收集的这篇文章主要介绍java线程sys_浅析java线程和OS线程的关系,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

探究java线程和OS线程之间的联系

一.准备工作

1.查看linux创建线程的方法    man pthread_create

20191107192230866457.png

根据man的配置可知,pthread_create会创建一个线程,这个函数是Linux的函数,可以通过C或者C++调用,该函数在pthread.h中

2.查看openjdk版本, rpm -qa | grep jdk

3.卸载原始openJDK版本 rpm -e --nodeps  xxxxx

20191107192230930912.png

4.准备oracle jdk7/jdk8,官网可自行下载对应的linux安装包

https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

openjdk下载路径(供参考)  https://blog.csdn.net/qq_23091073/article/details/83178848

5.将安装包放到虚拟机   /usr/java(目录可新建 mkdir -p /usr/java)目录解压  tar -zvxf jdk-7u79-linux-x64.tar.gz

6.配置JDK环境,编辑配置文件  vim /etc/profile

7新增环境变量

JAVA_HOME=/usr/java/jdk1.7.0_79

JRE_HOME=/usr/java/jdk1.7.0_79/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

20191107192230947515.png

8.重新加载配置文件,使其生效 source /etc/profile

9.验证是否安装配置完成  java  javac命令

20191107192230969000.png

二.探究线程的启动过程

1.直接通过C程序调用pthread_create方法创建线程

编写C程序文件 thread.c

20191107192230990485.png

编译thread.c文件   gcc -o thread.out thread.c

/tmp/cc9OHXUZ.o: In function `main‘:

thread.c:(.text+0x40): undefined reference to `pthread_create‘

collect2: ld 返回 1   编译报错

问题的原因:pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库函数的入口地址,于是链接会失败。

解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。

gcc -o thread.out thread.c -lpthread

执行./thread.out  成功打印  即可证明:可以通过C调用linux操作系统创建线程。

2.java如何调用OS创建线程?

探寻java创建的机制可知 java调用start()--> start0()[native本地方法]--->(OS)ptherad_create

利用java直接调用start0本地方法,在本地方法里面去启动一个系统线程(OS)

1.创建ThreadTest.java

System.load 和 System.loadLibrary区别

用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载

System.load 参数为库文件的绝对路径,可以是任意路径

System.loadLibrary 参数为库文件名,不包含库文件的扩展名

20191107192231010994.png

2.编译java文件   javac ThreadTest.java生成.class文件

3.javah packageName.ThreadTest生成ThreadTest.h头文件

tips:需要注意的运行javah命令得在包外面,相较于编译不一样,编译运行javac得在包当中

20191107192231035409.png 

20191107192231053964.png

4.解析类,把threadNew.c文件编译成为一个动态链接库,那么在java代码里会被laod到内存,libTestThreadNative这个命名需要注意libxx,xx相当于java所加载的类文件名

gcc ‐fPIC ‐I /usr/java/jdk1.7.0_79/include ‐I /usr/java/jdk1.7.0_79/include/linux ‐shared -o libTestThreadNative.so threadNew.c

执行上述指令后 ,会生成.libTestThreadNative.so文件

5.增加环境变量参数,是java文件可以寻找到该类库文件export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{libTestThreadNative.so}

说明 : {libTestThreadNative.so}为libTestThreadNative.so文件的绝对路径:/operation/thread/ 查看可以用echo命令

20191107192231115490.png

6.测试  java ThreadTest  可以观察到控制台打印线程的输出;

最后

以上就是无心画板为你收集整理的java线程sys_浅析java线程和OS线程的关系的全部内容,希望文章能够帮你解决java线程sys_浅析java线程和OS线程的关系所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部