zoukankan      html  css  js  c++  java
  • 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不可?
    使用JSON实现分页
    Git常用命令
    chrome浏览器tab页内存占用变大,网站变慢为哪般?
    我们前端跟后端是怎么合作的
    关于响应式布局
    AngularJS(1)
    关于php语言的使用!
    你必须收藏的Github技巧
    CSS3 动画
  • 原文地址:https://www.cnblogs.com/lean-blog/p/13615221.html
Copyright © 2011-2022 走看看