浅析java线程和OS线程的关系

探究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

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  可以观察到控制台打印线程的输出;

原文地址:https://www.cnblogs.com/vincentYw/p/11814198.html

时间: 2024-10-12 11:33:11

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

从 Java 到 JVM 到 OS 线程的优先级

前言Java 的线程的调度机制由 JVM 实现,假如有若干条线程,你想让某些线程拥有更长的执行时间,或某些线程分配少点执行时间,这时就涉及"线程优先级". 优先级别Java 把线程优先级分成10个级别,线程被创建时如果没有明确声明则使用默认优先级,JVM 将根据每个线程的优先级分配执行时间的概率.有三个常量 Thread.MIN_PRIORITY . Thread.NORM_PRIORITY . Thread.MAX_PRIORITY 分别表示最小优先级值(1).默认优先级值(5).最

浅析Java线程的三种实现

一.前言 java.lang.Thread类是java的线程类.当生成一个Thread类的对象后,一个新的线程就产生了.Java中每一个线程都是通过某个特定的Thread对象的方法run()来完成其操作的,方法run()称为线程体. 下面简单介绍Thread类的几种构造方法: public Thread() public Thread(Runnable target) public Thread(Runnable target,String name) public Thread(String

浅析Java线程的正确停止

线程错误终止之destroy与stop方法 记得以前初学Java的时候,由于缺少对锁.同步.异步等这些线程的知识,想当然的以为destroy与stop方法都能正确的停止Java线程的执行.但是,后来随着工作的积累,以及对线程安全的一些理解,慢慢认识到这两个方法是有问题的,并且这两方法也早已在java doc上被指名是弃用的. destroy()这个方法其实根本没干什么事情,只是抛出了一个NoSuchMethodError,所以说该方法无法终止线程,因此不能望文生意: /** * Throws {

浅析Java中线程组(ThreadGroup类)

Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示. 用户创建的所有线程都属于指定线程组,如果没有显式指定属于哪个线程组,那么该线程就属于默认线程组(即main线程组).默认情况下,子线程和父线程处于同一个线程组. 此外,只有在创建线程时才能指定其所在的线程组,线程运行中途不能改变它所属的线程组,也就是说线程一旦

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

java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_all.htm http://www.cnblogs.com/skywang12345/p/3447546.html 计算机的CPU计算能力超强,其计算速度与 内存等存储 和通讯子系统的速度相比快了几个数量级, 数据加载到内存中后,cpu处理器运算处理时,大部分时间花在等待获取去获取磁盘IO.网络通

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

[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计算机性能发展源动力的根本原因: 2)Amdahl 定律:该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力: 3)摩尔定律:该定律用于描述处理器晶体管数量与运行效率间的发展关系: Conclusion)这两个定律的更替代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展

Java线程模型、线程状态 - 线程(1)

1. 概述 众所周知,线程 - Thread 是比进程 - Progress 更轻量级的调度单位.简单来说,引入线程带来的好处是: 可以把一个进程 的资源分配和执行调度分开,各个线程 既可以共享进程 资源(内存地址.文件I/O等),又可以独立调度. 线程实现方式: 主流的操作系统都实现了线程 ,而编程语言一般会提供关于线程 的统一API操作.那么,编程语言如何去调用系统线程 呢?这方面主要有3种方式: 使用内核线程 - Kernel Thread. 一对一线程模型 ,这个最重要,下面详细讲. 使

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

问题 (1)线程有哪些类型? (2)线程模型有哪些? (3)各语言是怎么实现自己的线程模型的? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作"用户线程",而对应到操作系统,还有另外一种线程叫作"内核线程". 用户线程位于内核之上,它的管理无需内核支持:而内核线程由操作系统来直接支持与管理.几乎所有的现代操作系统,包括 Windows.Linux.Mac OS X 和 Solaris,都支持内核线程.

Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性.因此,为避免线程安全问题,应该避免多线程环境下对此共享资源的并发访问. 线程安全问题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的:当多个线程都执行写操作时,需要考虑线程同步来解决线程安全问题. 二.线程同步(synchr