package com.tigger;

public class MyThread {
static {
      //装载库,保证jvm在启动的时候就会装载
System.loadLibrary("TiggerThreadNative");
} public static void main(String[] args) {
MyThread myThread=new MyThread();
myThread.start0();
} private native void start0();
}

1、编写java代码 MyThread.java 使用jni调用一个c程序,上传至/home/mythread/com/tigger/目录下

2、编译成class程序   javac MyThread.java

3、生成头文件  javah packageName.ClassName 此命令需要在包外执行,javac命令需要在包当中执行

javah com.tigger.MyThread

  

4、将编译好的头文件移动到MyThread.java同级目录下

5、开始编写c程序threadNew.c,并放到/home/mythread/com/tigger/ 目录下

  

#include <pthread.h>
#include <stdio.h>
#include "com_tigger_MyThread.h" //需导入刚刚编译的.h文件
pthread_t pid;
void* thread_entity(void* arg)
{
while(1){
usleep(100);
printf("I am new Thread\n");
}
}
//此方法名需要从刚刚编译的.h头文件里复制方法名,这里参数写死
JNIEXPORT void JNICALL Java_com_tigger_MyThread_start0 (JNIEnv * evn, jobject c1)
{
pthread_create(&pid,NULL,thread_entity,NULL);
while(1){
usleep(100);
printf("I am main\n");
}
}
int main(){
return 0;
}

6、将threadNew.c编译成一个动态链接库,这样在java 代码里会被load到内存

gcc -I /usr/java/jdk1.8.0_221/include -I /usr/java/jdk1.8.0_221/include/linux  threadNew.c -fPIC -shared -o libTiggerThreadNative.so -pthread

7、将编译好的.so文件移动到/home/mythread/目录下 ,并加入到path,这样jvm才能load到

mv libTiggerThreadNative.so /home/mythread/

 进入mythread目录执行命令

export LD_LIBRARY_PATH=/home/mythread/

8、测试

java com.tigger.MyThread

  

C手写一个多线程,供java调用的更多相关文章

  1. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  2. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  3. 算法是什么(二)手写个链表(java)

    算法是什么(二)手写个链表(java)   liuyuhang原创,未经允许禁止转载 目录 算法是什么(〇) 很多语言的API中都提供了链表实现,或者扩展库中实现了链表. 但是更多的情况下,Map(或 ...

  4. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  5. 用过消息队列?Kafka?能否手写一个消息队列?懵

    是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...

  6. 手写一个最迷你的Web服务器

    今天我们就仿照Tomcat服务器来手写一个最简单最迷你版的web服务器,仅供学习交流. 1. 在你windows系统盘的F盘下,创建一个文件夹webroot,用来存放前端代码.  2. 代码介绍: ( ...

  7. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  8. 浅析MyBatis(二):手写一个自己的MyBatis简单框架

    在上一篇文章中,我们由一个快速案例剖析了 MyBatis 的整体架构与整体运行流程,在本篇文章中笔者会根据 MyBatis 的运行流程手写一个自定义 MyBatis 简单框架,在实践中加深对 MyBa ...

  9. 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

    摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...

随机推荐

  1. 在windows系统搭建Flutter开发环境

    开发环境搭建(Windows) 系统要求 设置FLutter镜像(非必须) 获取Flutter SDK Android开发环境设置 安装Flutter插件 系统要求 在Windows上要安装并运行Fl ...

  2. R语言:as.Date出现NA值

    > head(as.Date(data$日期,'%y%M%D'))[1] NA NA NA NA NA NA data日期格式如下: 解决办法: > head(as.Date(data$日 ...

  3. [Mybatis]执行一句Sql返回一个List<String>

    在Mapper.xml如下书写SQL文,其中 resultType告知MyBatis返回的类型: <select id="selectExpiredDate" resultT ...

  4. MySQL 的连接时长控制--interactive_timeout和wait_timeout

    在用MySQL客户端对数据库进行操作时,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR 2013 (HY000): Lost connection to MySQL server d ...

  5. 使用注解实现Spring的声明式事务管理

    使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...

  6. 深度学习之DCGAN

    1.知识点 """ DCGAN:相比GAN而言,使用了卷积网络替代全连接 卷积:256*256*3 --- > 28*28*14 -->结果 ,即H,W变小, ...

  7. 连接局域网mysql数据库

    1.先确认mysql服务端端口在防火墙是否开放外网连接(添加): windows防火墙 >高级设置 >入站规则 >新建规则 >选择端口 >添加端口 >后面直接下一步 ...

  8. 九十三:CMS系统之cms后台登录功能

    config form from wtforms import Form, StringField, IntegerFieldfrom wtforms.validators import Email, ...

  9. Python之网络模型与图形绘制工具networkx

    笔记 # https://www.jianshu.com/p/e543dc63454f import networkx as nx import matplotlib.pyplot as plt ## ...

  10. java数据结构之自定义队列

    一.队列的特点 1.队列是线性结构 2.先进先出,先进入队列的排在队列前端,会比后进队列的先出队列.FIFO 二.通过数组来实现队列 //自己实现数组队列,队列的特定就是先进先出 public cla ...