当前位置: 首页 > news >正文

调用Java线程相关的API为什么能够控制操作系统线程?

今天我们解决Java线程的这五个问题:

  1. Java线程创建的完整流程

  2. Java的线程是何时与JVM线程绑定的

  3. JVM线程是何时与OS线程绑定的

  4. Java线程对应的OS线程有什么特殊的地方

  5. 调用JavaAPI为什么能够操作OS线程

对于任何支持多线程的计算机语言来说,深入理解线程及写好多线程程序,都是一个巨大的挑战。正因为难,才使得多线程一直是面试的重点难点。面试官刚一开口扯到多线程,有些小伙伴内心就升起了慢慢的恐惧感。

平时在看相关的源码时也是,太多的无法理解,太多的无法证明,太多的native深入不下去……为了让大家精通多线程,我从Java级别的线程讲到OS级别的线程,再深入到OS内核级别,通过单步调试内核让你看看线程究竟为何物。

就这?当然不是,学到这里不还是理论吗?不还是没有动手能力吗?所以我带你全部手写实现,实现JMM、volatile、synchronized……感兴趣的可以看文末介绍。

如果你想从事中间件开发或者JVM相关工作,这是我问的一位朋友的岗位要求。跟我学完四期,把我布置的作业完成作为项目写入简历,你就能如愿以偿。底层开发工作,因为难,所以做的人不多,所以没那么卷,学历要求没那么高,但是薪资却很高,比CRUD有趣一万倍,没有35岁瓶颈,越老越吃香。如果你能成为TOP,就很抢手,拿股份,跨越阶层,成为人生赢家。实力真的可以改写规则,改变命运。信不信是你的自由。

图片

打成共识

在讲正式内容之前,咱们先在这几个名词上达成共识。上图

图片

Java的Thread对象,就是通过new创建的一个Java对象,在JVM中就是一个oop对象。这一步仅仅是创建一个Java对象,注意我的用词:仅仅。

Thread thread = new Thread();

JVM的JavaThread对象:这个对象是一个纽带,连接着Java的Thread对象与OS线程。欲知细节,往下看。

JVM的OSThread对象:这个对象你可以理解成是一个工具类,对OS线程API进行了功能性封装。其实我最开始看到这个类的时候,我就觉得何必搞这么一个类,抽象成这么多层,搞得太复杂了。

我后来悟到一个解释:一、JVM整体上还是面向对象的方式开发,而OS提供的线程API是面向过程式的,为了统一风格;二、JavaThread既然是一个纽带,那最好再设计一个JVM对象绑定OS线程。如果没有OSThread对象,那对操作系统线程的所有封装全部要写到JavaThread对象中,JavaThread对象就太乱了,不符合大佬编程更高,大佬一般都追求如丝般。这个解释只是我的个人理解,不知道写这块代码的大佬到底是怎么想的。

操作系统线程:这里仅指OS应用层线程。

在看下面的内容前,建议先把这四个名词搞明白,不然,我也阻止不了你继续往后面看,但你大概率会一脸懵逼。

再补一句,线程能力一定是OS提供的,就算是偏底层的虚拟机,也是无法提供线程能力的。JVM可以说是目前市面上最优秀、技术集大成的虚拟机,如果你把JVM吃透,讲道理,其他虚拟机都是小儿科了。当然,JVM因为过于追求性能、安全及普适性,有些地方设计得又复杂又臃肿,这也就是大厂自己定制开发JVM的原因所在。

线程创建流程

打成共识以后,上正餐,看看这段Java代码在JVM中是如何运行的

Thread thread = new Thread(() -> {System.out.println("子牙手写JVM");
});thread.start();

这段代码要拆成三部分看:

  1. 创建Thead对象,这个前面讲过了,略过

  2. start方法背后都做了什么?这个是重点。可以这样说,我们前面提的五个问题的答案。欲知细节,往下看。

  1. JVM是如何调用run方法的?通过JNI实现的,这个比较简单,略过。感兴趣的去研究下JNI提供的API

我先略过细节讲下关键流程节点,然后展开讲下关键流程节点。关于细节,感兴趣的小伙伴可自行研究,或者来跟我学习。

图片

JVM_StartThread核心做了两件事情:

  1. 创建JavaThread对象。对应的构造函数里面做了很多事情,等下展开讲

  2. 唤醒刚刚创建的线程。其实从Linux的角度来说,线程创建了会马上执行。而JVM在OS线程基础上做了一层封装,为了自身的线程机制,在OS线程创建后执行的逻辑中通过锁阻塞了线程,等一切准备就绪手动激活线程运行。

图片

创建JavaThread对象这步做了如下这些事情:

  1. 设置entry_point。JVM就是以此为跳板执行Thread的run方法的。这个细节后面写篇文章分享,一两句话讲不清。

  2. 调用os::create_thread创建OSThread对象及OS线程及完成三者之间的连接

图片

os::create_thread做了如下这些事情:

  1. 创建OSThread对象。对应的构造函数里面做的事情与这篇文章无关,略过

  2. 将JavaThread与OSThread进行关联:thread->set_osthread(osthread)

  3. 以分离属性创建OS线程:属性设置为PTHREAD_CREATE_DETACHED,调用pthread_create创建系统线程。这些都是Linux系统知识,大家可自行百度研究

  4. 后续操作OS线程的相关API都需要OS线程的ID,所以将OS线程ID保存:osthread->set_pthread_id(tid)

图片

至此,创建线程的核心节点就都给大家讲到了。对于Java线程与OS线程之间的关系及其关联细节,相信大家都有答案了。当然,关于线程的知识点还有很多很多,后面后陆续分享。喜欢子牙分享的内容的可关注一波。

我在研究Hotspot源码的时候画了详细的流程图,感兴趣的小伙伴可以关注公众号【硬核子牙】回复【start执行流程】获取。

相关文章:

调用Java线程相关的API为什么能够控制操作系统线程?

今天我们解决Java线程的这五个问题: Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用JavaAPI为什么能够操作OS线程 对于任何支持多线程的计算机语言来说,深入理解…...

【办公技巧】excel中设置选项按钮的方法

大家是否会遇到需要勾中选项的情况,我们可以在电子表格中制作出可以勾选、选中的选项按钮,今天我们一起学习一下设置方法。 首先,我们需要先在excel工具栏中添加一个功能模块:开发工具 依次点击excel中的文件 – 选项 – 自定义…...

如何编写高效的正则表达式?

正则表达式(Regular Expression,简称regex)是一种强大的文本处理技术,广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践,帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…...

vue3中使用pinia,更改state中数据,试图不更新问题

直接上代码 使用computed,可以实现。...

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…...

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本&#xff0c;项目安装eslint配置2.3 安装完成后&#xff0c;后面启动项目还缺少一些依赖&#xff0c;提前按需安装好 三&#xff0c;修改eslintrc.…...

ElasticSearch的DSL查询语法解析

Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询&#xff1a;会对用户输入内容分词&#xff0c;常用于搜索框搜索 &#xff0c;语法&#xff1a; 3.2 multi match…...

Linux 常用基础命令(2024年最新篇)新手小白必看 初识Linux

CSDN 成就一亿技术人&#xff01; 2024年 借助这篇文章 重新整理Linux 基础常用命令 CSDN 成就一亿技术人&#xff01; 上命令 一 &#xff0c;Linux语法格式 学习命令要掌握命令的格式 command [options] [arguments] 命令 选项 参数 二&#xff0c;Linux基础…...

Golang中for和for range语句的使用技巧、对比及常见的避坑

前言 基础语法不再赘述&#xff0c;写这个原因是之前的某次面试被问道了&#xff0c;我知道会导致问题但具体答下来不是很通顺。再回想自己开发过程中&#xff0c;很多地方都是使用到了for/for range&#xff0c;但是却从没注意过一些细节&#xff0c;因此专门学习一下进行记录…...

Nestjs 微服务实战 - 动态微服务创建链接

所有的微服务都需要做服务治理 服务治理包括&#xff08;配置中心、服务发现、注册服务等等&#xff09;&#xff0c;常见的包括 Java 的 Nacos&#xff0c;这里不关注与服务治理&#xff0c;只说明&#xff0c;如何用 nest 网关&#xff0c;并且在网关层动态实现微服务注入 …...

K8S部署pod状态CreateContainerConfigError问题解决

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

PyTorch 简单易懂的实现 CosineSimilarity 和 PairwiseDistance - 距离度量的操作

目录 torch.nn子模块Distance Functions解析 nn.CosineSimilarity 功能 主要参数 输入和输出的形状 使用示例 nn.PairwiseDistance 功能 主要参数 输入和输出的形状 使用示例 总结 torch.nn子模块​​​​​​​Distance Functions解析 nn.CosineSimilarity torc…...

app加载不到aar中的so库

如何将so文件打入到aar包中 1 在main下面新建jniLibs目录并将so放进去 2 在android{}中添加 sourceSets {main {jniLibs.srcDir file(jni/)}}app引用不到aar中的so文件(巨坑&#xff0c;不去查谁知道啊) 在aar 的manifeset application标签中中添加 android:extractNativeLi…...

vue-springboot基于java的实验室安全考试系统

本系统为用户而设计制作实验室安全考试系统&#xff0c;旨在实现实验室安全考试智能化、现代化管理。本实验室安全考试管理自动化系统的开发和研制的最终目的是将实验室安全考试的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的…...

mysql+关掉密码过期

mysql关掉密码过期 要在MySQL中关闭密码过期功能&#xff0c;可以按照以下步骤进行操作&#xff1a; 登录到MySQL服务器。 使用管理员账户&#xff08;如root&#xff09;连接到数据库。 mysql -uroot -ppassword 运行以下命令来查看当前的密码过期设置&#xff1a; SHOW…...

实际项目中的环形缓冲区

在实际项目中&#xff0c;环形缓冲区的设计要比之前讲到的原型稍微复杂一些&#xff0c;需要一些接口函数来实现数据结构封装。GitHub上有个大帅哥写了一个轻量的环形缓冲区库&#xff0c;可以学习参考&#xff0c;也可以直接集成到自己的项目中&#xff0c;功能已经非常完善。…...

输出回文数-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第23讲。 输出回文数&#…...

内存溢出会导致模块测试正常,植入系统失败

前些天&#xff0c;遇到了一个问题&#xff1a;需要在系统中添加一个小功能&#xff0c;单独测试&#xff0c;然后植入系统。 代码使用了从网上下载的函数&#xff0c;模块单独运行&#xff0c;没有问题&#xff0c;但是放在系统中运行就会出问题。 不得已的情况下&#xff0c…...

【taro react】 ---- QRCode 二维码生成

1. 需求分析 需要将输入的值转换为图片资源;由于只是单纯的展示,所以不需要很多比如加 logo 等复杂功能;不需要后端生成,直接前端操作;使用的第三方库尽可能小,功能单一;最后选择使用 qrcode-generator 库,只有 40kb。2. 使用第三方库 qrcode-generator 3. 转换 base…...

rk3566 armbian修复usb2.0并挂载U盘

文章目录 usb接口修复一 执行命令二 修改rk3566-panther-x2.dts⽂件三 查看是否识别 U盘格式化、挂载一 U盘格式化1.1 查看U盘1.2 查看U盘文件系统类型1.3 格式化为ext4系统 二 挂载U盘2.1 手动挂载2.2 自动挂载&#xff08;可选&#xff09; usb接口修复 一 执行命令 将位于…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...