Java并发编程—Thread类中的start()方法如何启动一个线程?

news/2024/5/18 22:39:02/文章来源:https://blog.csdn.net/qq_52545155/article/details/128125961

一、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.luyixian.cn/news_show_228446.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题目1444:蓝桥杯201 4年第五届真题斐波那契

这篇文章是帮一个叫做【废柴成长中】的孩子写的。 题目&#xff1a; 这里难点应该就是在【输入为一行用空格分开的整数n m p(0<n,m&#xff0c;p<10^18)】 &#xff0c;这里一下子就把最大值干成long的最大范围了&#xff0c;很明显&#xff0c;long肯定也不行。 解析其…

简单封装一个易拓展的Dialog

Dialog&#xff0c;每个项目中多多少少都会用到&#xff0c;肯定也会有自己的一套封装逻辑&#xff0c;无论如何封装&#xff0c;都是奔着简单复用的思想&#xff0c;有的是深层次的封装&#xff0c;也就是把相关的UI效果直接封装好&#xff0c;暴露可以修改的属性和方法&#…

带你学习不一样的数据仓库系列-框架概念

编者按&#xff1a;本系列文章参考总结自IBM,FaceBook&#xff0c;Google等数据仓库构建英文文章&#xff0c;部分章节为直译过来&#xff0c;部分内容加上乐哥6年陌陌&#xff0c;快手等工作经验总结而来&#xff0c;让大家了解真实国外大厂数仓构建之路&#xff0c;国外同行对…

RabbitMQ初步到精通-第十一章-RabbitMQ之常见问题汇总

目录 RabbitMQ之常见问题汇总 1.rabbitmq丢消息场景 1.1 消息未持久化丢失 1.2 消费时消息丢失 1.3 如何阻止消息丢失 2. mq消费消息是pull 还是 push 2.1 pull形式消费 2.2 push形式消费 3. mq重复消费场景 3.1 生产端重复情况 3.2 消费端重复 3.3 如何防止 4.pre…

今年十八,喜欢ctf-web

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1fad2;每日emo&#xff1a;等我把脸皮磨厚 &#x1f342;专栏地址&#xff1a;网安专栏 本来想早点睡&…

抓包工具简单介绍和 fiddler 安装

目录 1、 抓包工具介绍 2、原理 3、fiddler 安装 1、 抓包工具介绍 抓包工具&#xff0c;是个特殊的软件&#xff0c;相当于一个 “代理程序”&#xff0c;浏览器给服务器发的请求就会经过这个代理程序&#xff0c;进一步的就能分析出请求和响应的结果如何。 通俗的讲&…

【附源码】计算机毕业设计JAVA重工教师职称管理系统

【附源码】计算机毕业设计JAVA重工教师职称管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

【Pandas数据处理100例】(九十四):Pandas使用any()判断DataFrame中是否有True

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

Kotlin高仿微信-第26篇-朋友圈-选择图片、小视频对话框

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

基于ARM的环境参数检测系统设计(Labview+STM32+ZigBee)

目 录 1 绪论 1 1.1 研究背景和意义 1 1.2 研究现状 2 1.3 研究内容 3 2 系统概述和相关原理 4 2.1 系统的功能分析与设计 4 2.2 LabVIEW介绍 5 2.3 ZigBee技术 5 2.3.1 ZigBee技术概述 5 2.3.2 ZigBee网络协议 6 2.3.3 ZigBee网络拓扑结构 7 2.4 GSM技术 8 2.5 本章小结 8 3 …

[附源码]计算机毕业设计springboot企业售后服务管理系统

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

聚焦出海 长城汽车50多国家和地区经销商集团齐聚泰国车博会

11月30日&#xff0c;长城汽车携新能源豪华阵容登陆第39届泰国国际汽车博览会&#xff08;简称“泰国车博会”&#xff09;。以“GWM Light the Future”&#xff08;长城汽车点亮未来&#xff09;为参展主题&#xff0c;长城汽车旗下中大型商务豪华SUV坦克500 HEV量产版、欧拉…

pytest + yaml 框架 - 3.全局仅登录一次,在用例中自动在请求头部添加Authentication token认证

前言 我们在使用自动化测试框架的时候&#xff0c;经常会遇到一个需求&#xff0c;希望在全局用例中&#xff0c;仅登录一次&#xff0c;后续所有的用例自动带上请求头部token 或者cookies。 环境准备 Python 3.8版本 Pytest 7.2.0 最新版 pip 安装插件 pip install pytes…

iOS开发之打包上传到App Store——(一)各种证书的理解

OK&#xff0c;有日子没写iOS开发的相关文章啦&#xff0c;主要是最近的精力都没在这上面&#xff0c;不过既然产品已经快要出来了&#xff0c;就有必要了解一下各种证书啥的&#xff08;众所周知iOS的一堆证书可是很让人头大呀&#xff09;&#xff0c;最近确实被这个搞得头大…

Microsoft SQL Server 图书管理数据库的建立

文章目录题目描述创建数据库使用数据库创建三个表外码的表示形式结果展示题目描述 – 新建 “图书管理数据库" – 其中包含三个关系 – 图书&#xff08;编号&#xff0c;图书名&#xff0c;作者&#xff0c;出版社&#xff0c;类型&#xff0c;单价&#xff09; – 借阅…

Golang学习——基于vscode安装go环境

环境介绍 Linux x86_64 vscode 1.63.2 部署流程 下载并部署go安装包 根据实际环境&#xff0c;直接在go官网下载相应的编译好的二进制安装包即可&#xff1a; wget https://golang.google.cn/dl/go1.19.3.linux-amd64.tar.gz下载完成后解压安装包&#xff0c;然后将压缩包…

空域图像增强-图像灰度变换

1.图像灰度变换。自选一张图片&#xff0c;完成以下图像处理&#xff1a;①显示图像的灰度直方图&#xff1b;②直方图均衡化&#xff0c;对比变化前后的图像和灰度直方图&#xff1b;③对图像进行线性灰度变换&#xff0c;对某部分灰度值进行扩展&#xff0c;压缩其它灰度值区…

【发表案例】智能物联网类SCIEI,仅25天录用,计算机领域必投SCI快刊,12月截稿

【期刊简介】3.5-4.0&#xff0c;JCR2区&#xff0c;中科院3区 【检索情况】SCI&EI双检&#xff0c;正刊 【征稿领域】基于人工智能的工业物联网智能传感器 【参考周期】3个月左右 【截稿日期】2022年12月30日 【期刊简介】2.0-3.0&#xff0c;JCR3区&#xff0c;中科院…

unable to find valid certification path to requested target

调用https接口时出现该异常&#xff0c; Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 原因是可以看上图…

介绍一款特别好用的java反编译工具jd-gui

目录 写在前面 开始 写在前面 之前用过另一款java反编译工具jad 但是这个工具有个问题就是对于一些java8的新特性&#xff0c;比如lambda表达式是解析不出来的&#xff0c;更不用说java9和java17了。关于这款工具的使用方法就不再这里赘述了&#xff0c;如果你感兴趣可以在网…