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

做视频最全的网站按效果付费的网络推广方式

做视频最全的网站,按效果付费的网络推广方式,魔客吧wordpress主题如何安装,沧州南皮网站建设公司今天我们解决Java线程的这五个问题: Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用JavaAPI为什么能够操作OS线程 对于任何支持多线程的计算机语言来说,深入理解…

今天我们解决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执行流程】获取。

http://www.hkea.cn/news/27629/

相关文章:

  • 数据库修改网站管理员密码seo网站有优化培训吗
  • 福田做商城网站建设找哪家公司好抖音怎么运营和引流
  • 厘米售卡站怎么做网站禁止搜索引擎收录的方法
  • 网站首页滚动图片怎么做谷歌搜索关键词排名
  • 嵩县网站开发友情链接获取的途径有哪些
  • 国家企业信息公示网(广东)海南快速seo排名优化
  • 高端网站设计 上海徐州seo排名公司
  • 泰安网站建设公司排名石家庄最新消息
  • 域名只做邮箱没网站要备案吗常见的网络推广方式包括
  • 昆山建设局网站360搜索首页
  • 正常做网站多少钱无锡网站制作无锡做网站
  • php做网站csdn网站seo公司哪家好
  • 今日头条建站工具何鹏seo
  • wordpress 培训模板优化落实疫情防控新十条
  • 关于做外汇现货的网站太原整站优化排名外包
  • 星悦做任务网站是新网站百度收录
  • 十大营销网站seo关键词查询工具
  • 怎么查询网站所有关键词靠谱的广告联盟
  • 超酷的网站设计磁力搜索引擎
  • 网站建设写程序用什么软件成都疫情最新消息
  • 做网站需要什么资金2022今天刚刚发生地震了
  • 建设网站费用主要包括哪些google商店
  • 专注邯郸建设手机网站贴吧友情链接在哪
  • 网站备案拍照背景志鸿优化网官网
  • 网站百度知道怎么做推广网站搜索引擎优化的方法
  • 网站建设注意哪些问题sem和seo是什么职业岗位
  • 一_建设网站前的市场分析奶茶软文案例300字
  • 做网站智能工具江阴企业网站制作
  • 怎么看网站有没有做推广大数据营销系统多少钱
  • 广东工厂搜索seoseo平台优化服务