当前位置 博文首页 > 文章内容

    JAVA线程的本质

    作者: 栏目:未分类 时间:2020-09-04 18:00:22

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



        
        一、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\n");
       }
    }
    
    
    
    
    int main() {
    pthread_create(&pid,NULL,thread_entity,NULL);
      while(1){
       usleep(100);
      printf("I am main\n");
    }
    }
    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\n");
       }
    }
    // 这个名字与前面编译的头文件中的名字要一致
    Java_com_test_JavaCallThread_start1() {
    pthread_create(&pid,NULL,thread_entity,NULL);
      while(1){
       usleep(100);
      printf("I am main\n");
    }
    }
    View Code