探究java线程和OS线程之间的联系

一.准备工作

1.查看linux创建线程的方法    man pthread_create

根据man的配置可知,pthread_create会创建一个线程,这个函数是Linux的函数,可以通过C或者C++调用,该函数在pthread.h中

2.查看openjdk版本, rpm -qa | grep jdk

3.卸载原始openJDK版本 rpm -e --nodeps  xxxxx

4.准备oracle jdk7/jdk8,官网可自行下载对应的linux安装包

https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

openjdk下载路径(供参考)  https://blog.csdn.net/qq_23091073/article/details/83178848

Windows版安装Openjdk:http://jdk.java.net/java-se-ri/8

redhat版openjdk,解压后就能用,下载地址https://developers.redhat.com/products/openjdk/download

Azul Zulu版openjdk,解压后就能用,下载地址https://www.azul.com/products/zulu-and-zulu-enterprise/download-openjdk-10-for-windows/

5.将安装包放到虚拟机   /usr/java(目录可新建 mkdir -p /usr/java)目录解压  tar -zvxf jdk-7u79-linux-x64.tar.gz

6.配置JDK环境,编辑配置文件  vim /etc/profile

7新增环境变量

JAVA_HOME=/usr/java/jdk1.7.0_79
JRE_HOME=/usr/java/jdk1.7.0_79/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

8.重新加载配置文件,使其生效 source /etc/profile

9.验证是否安装配置完成  java  javac命令

二.探究线程的启动过程

1.直接通过C程序调用pthread_create方法创建线程

编写C程序文件 thread.c

编译thread.c文件    gcc -o thread.out thread.c

/tmp/cc9OHXUZ.o: In function `main':

thread.c:(.text+0x40): undefined reference to `pthread_create'

collect2: ld 返回 1   编译报错
问题的原因:pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库函数的入口地址,于是链接会失败。
解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。
           gcc -o thread.out thread.c -lpthread

执行./thread.out  成功打印  即可证明:可以通过C调用linux操作系统创建线程。

2.java如何调用OS创建线程?

探寻java创建的机制可知 java调用 start()--> start0()[native本地方法]--->(OS)ptherad_create

利用java直接调用start0本地方法,在本地方法里面去启动一个系统线程(OS)

1.创建ThreadTest.java

System.load 和 System.loadLibrary区别

用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载

System.load 参数为库文件的绝对路径,可以是任意路径

System.loadLibrary 参数为库文件名,不包含库文件的扩展名

2.编译java文件   javac ThreadTest.java  生成.class文件

3.javah packageName.ThreadTest       生成ThreadTest.h头文件

tips:需要注意的运行javah命令得在包外面,相较于编译不一样,编译运行javac得在包当中

 

4.解析类,把threadNew.c文件编译成为一个动态链接库,那么在java代码里会被laod到内存,libTestThreadNative这个命名需要注意libxx,xx相当于java所加载的类文件名

gcc -fPIC -I /usr/java/jdk1.7.0_79/include -I /usr/java/jdk1.7.0_79/include/linux -shared -o libTestThreadNative.so threadNew.c

执行上述指令后 ,会生成.libTestThreadNative.so文件

5.增加环境变量参数,是java文件可以寻找到该类库文件 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{libTestThreadNative.so

 说明 : {libTestThreadNative.so}为libTestThreadNative.so文件的绝对路径:/operation/thread/ 查看可以用echo命令

6.测试  java ThreadTest  可以观察到控制台打印线程的输出;

浅析java线程和OS线程的关系的更多相关文章

  1. 从Java到JVM到OS线程睡眠

    Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过 Thread.sleep 使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么. 简单例子 以下是一个简单的例子,使主线程睡眠 ...

  2. java线程与内核线程的关系,及怎么定义ThreadPoolExecutor相关参数

    p.p1 { margin: 0; font: 12px Menlo } p.p1 { margin: 0; font: 12px Menlo } p.p2 { margin: 0; font: 12 ...

  3. 浅析Java中线程组(ThreadGroup类)

    Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...

  4. 浅析java中的四种线程池

      1.使用线程池的好处 2.JUC中几种常用的线程池 java.util.concurrent包下的Executors工厂类,提供了一系列的线程池的创建方法,其构造方法如下: public Thre ...

  5. java内存模型与线程(转) good

    java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_ ...

  6. Java并发编程基础-线程安全问题及JMM(volatile)

    什么情况下应该使用多线程 : 线程出现的目的是什么?解决进程中多任务的实时性问题?其实简单来说,也就是解决“阻塞”的问题,阻塞的意思就是程序运行到某个函数或过程后等待某些事件发生而暂时停止 CPU 占 ...

  7. jvm(12)-java内存模型与线程

    [0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识:   [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计 ...

  8. 死磕 java线程系列之线程模型

    问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...

  9. Java并发编程之线程池及示例

    1.Executor 线程池顶级接口.定义方法,void execute(Runnable).方法是用于处理任务的一个服务方法.调用者提供Runnable 接口的实现,线程池通过线程执行这个 Runn ...

随机推荐

  1. Tasteless challenges medium WP

    http://chall.tasteless.eu/ 国外的一个靶场,都是单点知识,medium大部分还是比较简单 medium Level 1- Infiltration http://chall. ...

  2. [转]C#操作Outlook

    本文转自:https://blog.csdn.net/yanlovehan/article/details/8500449 //引用Microsoft.Office.Interop.Outlook.d ...

  3. Pi Network有梦想是好的,最新消息和下载注册流程。

    (注册流程最下面) ---------------------------------------------------------------------------------- 今日更新(10 ...

  4. 微信小程序上拉加载——分页

    wxml: <view class="page"> <scroll-view class="imageViewCss_1" scroll-y= ...

  5. DataGuard搭建逻辑StandBy

    DataGuard搭建逻辑StandBy 原创 作者:bayaim 时间:2016-03-31 17:23:48 272 0删除编辑   物理StandBy优点是效率高,缺点是只读模式不能恢复,恢复模 ...

  6. Python—函数的参数传递

    形参和实参 形参即形式参数,函数完成其工作时所需的信息.形参不占用内存空间,只有在被调用时才会占用内存空间,调用完了即被释放. 实参即实际参数,调用函数时传给函数的信息. # -*- coding: ...

  7. 无序数组中用 快速排序的分治思想 寻找第k大元素

    #include <stdio.h> int *ga; int galen; void print_a(){ ; i < galen; i++){ printf("%d & ...

  8. 2. Linux文件与目录管理

    一.目录与路径 1. 相对路径与绝对路径 绝对路径:路径写法[一定由根目录 / 写起],如:/usr/share/doc 相对路径:路径写法[不由 / 写起], /usr/share/doc 要到 / ...

  9. [C6] Andrew Ng - Convolutional Neural Networks

    About this Course This course will teach you how to build convolutional neural networks and apply it ...

  10. 求解LCA问题的几种方式

    求解LCA问题的几种方式 这篇随笔讲解图论中LCA问题(最近公共祖先)的几种求解方式及实现方法.LCA问题属于高级图论,所以希望读者学习过初级图论,知道图的一些基本知识,并懂得深搜算法的实现方式.这样 ...