Java并发编程—Thread类中的start()方法如何启动一个线程【原理分析】?

news2024/11/27 2:16:34

一、java线程的介绍:

在java的开发过程中,很多铁子对于java线程肯定不感到陌生,作为java里面重要的组成部分,这里就从如何创建一个线程给大家进行分析;

二、相关知识引入:

​ 之前我了解过,java的线程其实是映射到操作系统的内核线程上的 ,所以Java线程基本上也就是操作系统在进行管理;大家都知道java语言内置了多线程技术,说到底其实就是java语言通过了一些操作请求了操作系统从而分配了创建线程的一些资源;

​ 那么具体的是如何进行操作呢?

三、文件准备

​ 在我们这里的分析过程中会涉及到一些java源代码openJDK文件中的代码展示,所以需要大家准备一下openJDK,我这里将其分享出来

链接: https://pan.baidu.com/s/1No90NPoMI9PF7hIHk3nAUg?pwd=9qzu 提取码: 9qzu

四、源码分析

1、在我们java代码中创建线程主要是用的Thread类,所以第一步我们先创建一个Thread类对象;

 public static void main(String[] args) {
        //创建线程并调用start()方法
        new Thread().start();
    }							

2、我们创建了一个Thread类,自然会调用Thread类里面的构造方法,这个时候我们按住Thread来到Thread.java类里面,可以看到进入到了这个类里面

在这里插入图片描述

3、关键的不是这个构造方法,我们来到类名这儿,可以看到有个静态方法,这个静态方法在对象创建的时候也会执行,然后会调用里面的registerNatives()方法,而这个方法就在他头上

在这里插入图片描述

这里给大家说创建对象主要是分享静态方法里面会去调用registerNatives方法,他会去进行一个执行,大家记住这个点就好了;

4、这个时候我们就来到 registerNatives()静态方法这儿,可以看到里面有一个native这个单词修饰,这个在之前可能大家可能都不知道;

我这里给大家做一个解释,这个native在java里面的一个含义:有native关键字修饰的方法,表示通过jvm调用底层操作系统的函数方法;就是去调用c语言的方法
综上,所以在这个registerNativs方法中,java的任务就完成了,java就是让jvm去调用c相关的方法进行一个执行;

5、那我们就应该去找到c相关文件中的registerNativs方法,看看他到底是什么意思,于是这个时候打开openJKD文件,找到openjdk-8u40-src-b25-10_feb_2015\openjdk\jdk\src\share\native\java\lang\Thread.c文件,打开看到里面的内容

在这里插入图片描述

这里面是定义了一个数组,数组中存放的为JNINativeMethod类型的结构体变量,JNINativeMethod这种类型如下,这个类型的定位是在jni.h文件中:
typedef struct {
    char *name;
    char *signature;
    void *fnPtr;
} JNINativeMethod;
 
JNINativeMethod主要是进行一个jni方法的映射关系,将native方法【可以理解成java方的名词】和真正的实现方法【c语言里面的方法名】进行绑定。

6、当映射被绑定后,java里面就能通过一些jni方法去找到c语言里面对应的真实方法,然后java执行start()后,会去Thread里面执行start0()方法

在这里插入图片描述

7、所以这个时候,就会通过jvm去找映射关系,在映射里面start0对应的是JVM_StartThread方法,所以就来到了第二个关键文件,openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot\src\share\vm\prims\jvm.cpp,这个文件里面存放了JVM_StartThread这个方法做的事情,

在这里插入图片描述

8、往下面走,来到2851行代码,会发现一个new的代码,他这个里面做的功能是创建一个Java线程对应的内核线程,主要就是靠这个构造方法创建一个对象然后放到native_thread变量中

在这里插入图片描述

9、接着,来到2884行代码里面,可以看到调用了Thread::start(native_thread)这个方法,他就是带着刚刚创建好的变量然后进行一个启动操作,所以我们需要找到Thread::start(native_thread),他这里面做了什么事情

在这里插入图片描述

10、所以我们继续来到第三个关键文件,openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot\src\share\vm\runtime\Thread.cpp,然后根据上面的Thread::start(native_thread)直接搜一把就可以找到这个方法

在这里插入图片描述

11、上面的方法中,前面几行简单,来到464行,里面有一个os::start_thread(thread);这个里面有个os,他代表操作系统,意思就是让操作系统去执行start_thread(thread)方法,便开始真正的启动Java线程对应的内核线程,自此一个大概流程就走完了,到这里java线程就运行起来了,有些小细节没有说,更多的细节可以进一步了解。

五、名词解析:

1、native关键字修饰的方法,表示通过jvm调用底层操作系统的函数方法
2、JNI=java native interface
3、线程其实和java没多大关系,只是java能通过一些接口然后最终让操作系统为其创建线程

六、总结

java中创建线程并执行首先是jvm通过JNI方式加载好映射文件,然后通过start0这个名词找到对应的c文件里面的JVM_StartThread方法,然后在jvm.cpp文件中找到JVM_StartThread方法执行流程,然后通过os创建线程并最终执行

的c文件里面的JVM_StartThread方法,然后在jvm.cpp文件中找到JVM_StartThread方法执行流程,然后通过os创建线程并最终执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试

2022年中职组浙江省“网络空间安全”赛项 B-1:Windows渗透测试一、竞赛时间 420分钟 共计7小时 吃饭一小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第①阶段: 单兵模式系统渗透测试 任务一: Windows操作系统渗透测试 任务二: Linux操作系统渗透测试 任务三…

[附源码]Python计算机毕业设计SSM科技项目在线评审系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

segmenter

patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patch大小为16x16,则每张图像会生成224x224/16x16196个patch,即输入序列长度为196,每个patch维度16x16x3768,线性投射层…

hexo+github手把手教你部署个人博客

一、安装并配置Node.js(原本就有安装) 参考:(1条消息) Node.js安装与配置(详细步骤)_普通网友的博客-CSDN博客_nodejs安装配置 一、下载Node.js官网下载 安装位置与环境变量配置 系统属性-环境变量-系统变量-Path 验…

129页4万字某智慧能源集团数字化管控平台项目 建设方案

目录 数字化管控平台相关项目建议书 1 目录: 1 一、相关项目背景 2 二、需求理解 3 2.1 需求理解 3 三、方案设计 5 3.1 整体方案设计 7 3.3.1 整体架构 7 3.3.2 解决方案说明 8 3.3.3 需求应答 10 3.2 数据仓库 11 3.2.1 数据仓库架构 11 3.2.2 数据仓库产品说明 1…

springMVC01,【第一个springMVC例子(注解版):HelloWorld】

springMVC01,【第一个springMVC例子-注解版:HelloWorld】创建项目1.配置web.xml2.编写spring配置文件3.controller层3.1RequestMapping注解4.运行测试5.小结链接: springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本)&#x…

一种多引擎可视化数据流实现方案

企业大数据处理的挑战 随着大数据时代的到来,数据量迅猛增长,给传统的分析技术带来了巨大的冲击和挑战,企业面临着大数据处理的巨大挑战。将复杂的大数据处理问题进行简化,以便企业有更多人能够进行大数据处理,进而整…

使用azure-data factory

data-fatory介绍 Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS。ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-free UI&…

[附源码]SSM计算机毕业设计疫情防控期间人员档案追寻系统设计与实现论文JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

操作系统实验5:信号量的实现与应用

写在最前的总结 下面的实验内容是在完整做完实验时候补充的,这里先把踩过的坑记录一下。 调试总结 先在Ubuntu上模拟生产者—消费者问题。这个实验分为两大部分,一个是实现信号量,另一个是验证信号量。对于第二个,建议先在Ubun…

银河麒麟 linux V10 安装JDK

1、安装JDK之前,先查看系统是否已安装JDK相关软件包: 2. 如果已经安装过,可以先卸载(可以跳过) 3. 下载并解压jdk包 # 将下载好的jdk压缩包解压到指定目录/usr/local/jdk8 mkdir /usr/local/jdk8 cp jdk-8u271-linu…

详解设计模式:享元模式

享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式。 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象…

[附源码]Python计算机毕业设计SSM跨移动平台的新闻阅读应用(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

二、Eureka服务注册与发现

Eureka服务注册与发现 Eureka基础知识 什么是服务治理 SpringCloud封装了Netflix公司开发的Eureka模块来实现服务治理。 在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂、所以需要进行服务治理,管理服务与服务之间依赖关联&…

网上商店商城购物系统(asp.net,sqlserver,三层架构)

网上商店商城购物系统(asp.net,sqlserver,三层)(毕业论文10000字以上,程序代码,SqlServer数据库) 【运行环境】 VisualStudio SqlServer 代码下载: 链接:https://pan.baidu.com/s/1gzX_-Dzrt5jDHvQOCTN7qQ 提取码:8888 【项目包含内容…

Docker with IPV6

1、绪论 在 Docker 容器或群服务中使用 IPv6 之前,您需要在 Docker 守护进程中启用 IPv6 支持。之后,您可以选择对任何容器、服务或网络使用 IPv4 或 IPv6(或两者) 2、配置默认 Docker IPv6 注意:IPv6 网络仅在 Lin…

vue - vue使用webpack-bundle-analyzer进行代码打包的可视化数据分析

vue使用webpack-bundle-analyzer插件可以明确的看出每个文件模块的大小;常用来分析打包文件,优化代码等操作; 安装使用之后的效果如下:启动或打包项目,自动会在浏览器打开这个页面; 可以看出:右上角最蓝色的…

蓝牙学习五(广播包分析wireshark)

1.简介 软件工具:wireshark 硬件抓包工具:nrf52840 dongle 2.数据包分析 使用wireshark抓到的数据包分为两个部分,一部分是软件自己添加的内容,另一部分才是广播出来的数据。 2.1软件添加部分 软件添加的大部分内容可以不关注。这…

结构力学常用公式表,早晚用得到!

来源:360个人图书馆 常用截面几何与力学特征表​​​​​​​ 注: I 称为截面对主轴(形心轴)的截面惯性矩 (mm4)。基本计算公式如下: W称为截面抵抗矩 (mm),它表示截面抵抗弯曲变形能力的大小&#xff0c…

SQL29 计算用户的平均次日留存率

原题链接 【描述】 题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 【示例】:question_practice_detail 【题目分析】摘自题解区"Reg333"的题解 所谓次日留存,指的是同一用户&#x…