Java线程就是操作系统的线程(gold_axe)

2020-10-25  本文已影响0人  胖达_4b7e

自己写一个

1. 调用native方法的java类:

package com.shadow.app;
public class EnjoyThread {
  //装载库,保证JVM在启动的时候就会装载,故而一般是也给static
 static {
   System.loadLibrary( "EnjoyThreadNative" );
 }
 public static void main(String[] args) {
   EnjoyThread enjoyThread =new EnjoyThread();
   enjoyThread.start0();
 }
 private native void start0();
}

除了编译成对应class文件以外, 还要编译一个.h的头文件:
javac -h . EnjoyThred.java
打开它 看native方法的该叫什么名字

叫Java_com_shadow_app_EnjoyThread_start0

2. native方法所在的.c文件

开始写一个.c文件,
取名threadNew.c, 通过Java_com_shadow_app_EnjoyThread_start0 这个方法名调

#include <pthread.h>
#include <stdio.h>
//定义变量接受线程id
pthread_t pid;
//线程的主体方法相当于 java当中的run
void* thread_entity(void* arg) {
  //子线程死循环
  while(1){
    //睡眠100毫秒
    usleep(100);
    //打印
    printf("I am new Thread\n"); 
 }
}
//这个方法名字需要参考.h当中的方法名字,打开.h文件,复制方法名过来
//参数固定
Java_com_shadow_app_EnjoyThread_start0(JNIEnv *env, jobject c1) {
  //调用linux的系统的函数创建一个线程
  pthread_create(&pid,NULL,thread_entity,NULL);
  //主线程死循环
  while(1){
    //睡眠100毫秒
    usleep(100);
    //打印
    printf("I am main\n");
 }
}

pthread_create :linux操作系统的线程控制原语
参数:
&pid 就是返回的线程号
thread_entity 就是让linux 线程干的活(直接写函数名)

4.需要把 .c文件变编译成so文件, 加入环境变量

so文件的名字 必须是 lib+名字
java类里面指定了 要加载 EnjoyThreadNative
所以 threadNew.c 要编译成 libEnjoyThreadNative

把so文件所在目录加入环境变量 , 让jvm 能找到他

5. EnjoyThread.class 正常运行 就行了

能起一个linux线程

上一篇 下一篇

猜你喜欢

热点阅读