一、JAVA线程的本质是什么?通过本文真正了解JAVA线程
二、测试使用的Java版本:java version "1.8.0_211"
三、通过C语言来调用操作系统底层API创建线程-java语言的本质
-
操作系统Linux线程:pthread_create (创建线程)
-
如何使用pthread_create呢( man pthread_create )
-
用C语言来调用pthread_create来创建一个线程
-
代码保存为thread.c
-
将C语言代码编译成可执行文件thread.out ----- gcc thread.c -o thread.out -pthread
-
编译完成会生成一个可执行文件thread.out 然后 执行这个文件: ./thread.out
-
可以看到结果为 主线程和子线程会交替执行打印,说明的确启动了一个线程
代码3:
#include <pthread.h> #include <stdio.h> pthread_t pid; void* thread_entity(void* arg) { while(1){ usleep(100); printf("I am new Thread "); } } int main() { pthread_create(&pid,NULL,thread_entity,NULL); while(1){ usleep(100); printf("I am main "); } }
四、通过Java程序调用C语言来启动线程-JNI
1)写Java代码,并附带加载C对应的库文件 - 代码1
2)编译Java代码
javac com/test/JavaCallThread.java
3)javac -h 把java文件编译一个头文件出来
cd com/test/
javac -h . JavaCallThread.java
4)按照生成的头文件中的方法名称,写一个C语言的类,并编译一个so文件,并放到环境变量中,这样Java文件就可以加载到这个C类库 - C代码2
代码编译为so文件: gcc -fPIC -I /usr/java/jdk1.8.0_211/include -I /usr/java/jdk1.8.0_211/include/linux/ -shared -o libJavaCallThreadNative.so threadNew.c
将so文件加载到内存中:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/yqtest
注意:
-
/usr/java/jdk1.8.0_211/include/linux 这个目录为java中jni所在的目录
-
libJavaCallThreadNative.so 这个名称为lib(java程序load中写的名字).so
-
threadNew.c ,这个为C文件的名字
5)运行Java代码,查看调用结果
运行我们编译好的Java文件: java com/test/JavaCallThread(注意环境变量中需要设置当前目录否则不能执行)
Java主代码-代码1:
package com.test; /** * Hello world! * */ public class JavaCallThread { static { System.loadLibrary( "JavaCallThreadNative" ); } public static void main(String[] args) { JavaCallThread callThread =new JavaCallThread(); callThread.start1(); } private native void start1(); }
C代码2:
#include <pthread.h> #include <stdio.h> pthread_t pid; void* thread_entity(void* arg) { while(1){ usleep(100); printf("I am new Thread "); } } // 这个名字与前面编译的头文件中的名字要一致 Java_com_test_JavaCallThread_start1() { pthread_create(&pid,NULL,thread_entity,NULL); while(1){ usleep(100); printf("I am main "); } }