浅析java线程和OS线程的关系
Posted VincentYew
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析java线程和OS线程的关系相关的知识,希望对你有一定的参考价值。
探究java线程和OS线程之间的联系
一.准备工作
1.查看linux创建线程的方法 man pthread_create
根据man的配置可知,pthread_create会创建一个线程,这个函数是Linux的函数,可以通过C或者C++调用,该函数在pthread.h中
2.查看openjdk版本, rpm -qa | grep jdk
3.卸载原始openJDK版本 rpm -e --nodeps xxxxx
4.准备oracle jdk7/jdk8,官网可自行下载对应的linux安装包
https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
openjdk下载路径(供参考) https://blog.csdn.net/qq_23091073/article/details/83178848
Windows版安装Openjdk:http://jdk.java.net/java-se-ri/8
redhat版openjdk,解压后就能用,下载地址https://developers.redhat.com/products/openjdk/download
Azul Zulu版openjdk,解压后就能用,下载地址https://www.azul.com/products/zulu-and-zulu-enterprise/download-openjdk-10-for-windows/
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
8.重新加载配置文件,使其生效 source /etc/profile
9.验证是否安装配置完成 java javac命令
二.探究线程的启动过程
1.直接通过C程序调用pthread_create方法创建线程
编写C程序文件 thread.c
编译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
1.创建ThreadTest.java
System.load 和 System.loadLibrary区别
用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载
System.load 参数为库文件的绝对路径,可以是任意路径
System.loadLibrary 参数为库文件名,不包含库文件的扩展名
2.编译java文件 javac ThreadTest.java 生成.class文件
3.javah packageName.ThreadTest 生成ThreadTest.h头文件
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命令
6.测试 java ThreadTest 可以观察到控制台打印线程的输出;
以上是关于浅析java线程和OS线程的关系的主要内容,如果未能解决你的问题,请参考以下文章
Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析