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

news2024/11/26 2:42:20

一、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/50445.html

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

相关文章

jQuery 简介

jQuery 库可以通过一行简单的标记被添加到网页中。 您需要具备的基础知识 在您开始学习 jQuery 之前,您应该对以下知识有基本的了解: HTMLCSSJavaScript 如果您需要首先学习这些科目,请在我们的 首页 查找这些教程。 什么是 jQuery &#x…

[附源码]Python计算机毕业设计Django的高校资源共享平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

无人机机械臂爪机器臂爪的安装调试试验。以大疆哪吒为例乐迪T8Fb遥控器。

首先将机械爪安装完毕。注意不要装的太紧,否则会损害舵机,应力度合适,可以先使用舵机测试仪测试。 安装舵机到位。要使用机械爪配套的舵机型号,否则孔位对不上。 调整螺丝孔位,确保齿轮能够吻合。 调整螺丝松紧&#…

JavaScript 基础笔记

初识 JavaScript JavaScript负责页面中的的行为,是一门运行在客户端的脚本语言。 解释型语言与编译型语言区别: JavaScript 作用 表单动态校验(密码校验)网页特效服务端开发桌面端开发等作用 JS引擎:浏览器使用Js引…

Vue3多个弹窗同时出现解决思路

Vue3多个弹窗同时出现解决思路 弹窗或者说对话框是我们在开发系统或者页面很常用的元素,所以博主想对出现多个弹窗的情况下的解决思路进行一个整理 有时候我们一个页面可能存在多个弹窗,当多个弹窗出现的时候可能屏幕就变的很黑,如下图所示…

图观引擎V3.3.4 功能更强、操作更便捷!最新升级一睹为快

图观™引擎,自去年内测版推出上线以来,已帮助众多合作伙伴开发出自己的数字孪生应用、落地交付数字孪生项目,实现了自身软件产品的全面升级、技术能力的大幅拓展。 经过不断的升级迭代,图观™引擎V3.3.4版本,更加注重…

Seata中TC服务部署及微服务集成Seata

seata的部署和集成 一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包,地址在http😕/seata.io/zh-cn/blog/download.html 2.解压 在非中文目录解压缩这个zip包,其目录结构如下: 3.修改配置 修改conf目录下的re…

微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.1 网关作用介绍

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构8 Gateway 网关8.1 网关作用介绍8.1.1 为什么需要网关8.1.2 网关的技术实现…

高数 | 周洋鑫 冲刺预测题自用整理复习

自用笔记整理复习。 内容来自2023周洋鑫冲刺班。 加油ヾ(◍∇◍)ノ゙ 1、函数极限计算 【加项减项】 ☆ 二次积分求极限

极值分析:分块极大值BLOCK-MAXIMA、阈值超额法、广义帕累托分布GPD拟合降雨数据时间序列...

全文链接:http://tecdat.cn/?p25348 你们可能知道,实际极值分析有两种常用方法:分块极大值Block-maxima、阈值超额法threshold excess(点击文末“阅读原文”获取完整代码数据)。今天,我们将分别介绍这两种…

【C++】vector 的使用及其模拟实现

一、vector 的使用 vector 是我们学习的第一个真正的 STL 容器,它接口的使用方式和 string 有一点点的不同,但大部分都是一样的,所以这里我们就只演示其中一些接口的使用,大家如果有疑惑的地方直接在 cplusplus 是上面查看对应的…

[附源码]计算机毕业设计springboot抗疫医疗用品销售平台

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

智引未来,利尔达成功入选首批“5G应用解决方案供应商推荐名录”名单

近日,5G应用产业方阵(5G AIA)在“2022年中国5G发展大会5G应用产业发展论坛”发布了“5G应用解决方案供应商推荐名录(第一批)”入库名单,旨在强化5G应用供需对接,推动5G应用解决方案成熟&#xf…

基于PHP+MySQL共享自行车租赁管理系统的设计与实现

随着环保意识的增加,人们的出行越来越简单便捷,其中共享自行车是现在很多年轻人最热衷的出行方式之一,本系统主要是对共享自行车的信息进行管理。该系统的基本功能包括用户登录,区域信息管理,用户信息管理,用户充值管理,车辆信息管理,租借信息管理,损耗信息管理,统计报表信息,修…

【自然语言处理概述】“海量”文件遍历

【自然语言处理概述】“海量”文件遍历 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设…

有关C++的异常机制

目录 为什么要有异常: 异常的抛出和捕获: 为什么要有异常: 异常在C用于错误处理,C语言中一般使用返回值表示错误,C对于错误处理进行了拓展,统一使用异常机制来处理程序中发生的错误 C的异常处理包括两个部分…

Myeclipse配置tomcat服务器

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏:国学周更-心性养成之路…

[附源码]Python计算机毕业设计Django的小说阅读系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

浅谈linux - 线程的基本应用

概述 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 注意 线程和进程之间的区别 1. 线程是执行的基本单位;进程是资源分配的基本单位。 2. 线程共享进程的资源…

【Eureka】【源码+图解】【七】Eureka的下线功能

【Eureka】【源码图解】【六】Eureka的续约功能 目录6. 下线6.1 shutdown()6.2 服务端cancel6.3 同步其他server节点6. 下线 主动下线方式 服务端:/eureka/apps/{application.name}/{instance-id},以本系列文章的helloworld为例,发送DELETE…