JAVA线程的本质

    
    一、JAVA线程的本质是什么?通过本文真正了解JAVA线程
    二、测试使用的Java版本:java version "1.8.0_211"
    三、通过C语言来调用操作系统底层API创建线程-java语言的本质
  1. 操作系统Linux线程:pthread_create (创建线程)
  2. 如何使用pthread_create呢( man pthread_create )
  3. 用C语言来调用pthread_create来创建一个线程
  4. 代码保存为thread.c
  5. 将C语言代码编译成可执行文件thread.out  -----    gcc thread.c -o thread.out -pthread
  6. 编译完成会生成一个可执行文件thread.out 然后  执行这个文件: ./thread.out
  7. 可以看到结果为 主线程和子线程会交替执行打印,说明的确启动了一个线程 

  代码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
");
}
}
View Code
四、通过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();
}
View Code

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
");
}
}
View Code
原文地址:https://www.cnblogs.com/lean-blog/p/13615221.html