东莞网站设计怎么做?,网站海外seo,wordpress 优化插件,网站底部悬浮代码今天我们解决Java线程的这五个问题#xff1a; Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用JavaAPI为什么能够操作OS线程 对于任何支持多线程的计算机语言来说#xff0c;深入理解…今天我们解决Java线程的这五个问题 Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用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(); 这段代码要拆成三部分看 创建Thead对象这个前面讲过了略过 start方法背后都做了什么这个是重点。可以这样说我们前面提的五个问题的答案。欲知细节往下看。 JVM是如何调用run方法的通过JNI实现的这个比较简单略过。感兴趣的去研究下JNI提供的API 我先略过细节讲下关键流程节点然后展开讲下关键流程节点。关于细节感兴趣的小伙伴可自行研究或者来跟我学习。 JVM_StartThread核心做了两件事情 创建JavaThread对象。对应的构造函数里面做了很多事情等下展开讲 唤醒刚刚创建的线程。其实从Linux的角度来说线程创建了会马上执行。而JVM在OS线程基础上做了一层封装为了自身的线程机制在OS线程创建后执行的逻辑中通过锁阻塞了线程等一切准备就绪手动激活线程运行。 创建JavaThread对象这步做了如下这些事情 设置entry_point。JVM就是以此为跳板执行Thread的run方法的。这个细节后面写篇文章分享一两句话讲不清。 调用os::create_thread创建OSThread对象及OS线程及完成三者之间的连接 os::create_thread做了如下这些事情 创建OSThread对象。对应的构造函数里面做的事情与这篇文章无关略过 将JavaThread与OSThread进行关联thread-set_osthread(osthread) 以分离属性创建OS线程属性设置为PTHREAD_CREATE_DETACHED调用pthread_create创建系统线程。这些都是Linux系统知识大家可自行百度研究 后续操作OS线程的相关API都需要OS线程的ID所以将OS线程ID保存osthread-set_pthread_id(tid) 至此创建线程的核心节点就都给大家讲到了。对于Java线程与OS线程之间的关系及其关联细节相信大家都有答案了。当然关于线程的知识点还有很多很多后面后陆续分享。喜欢子牙分享的内容的可关注一波。 我在研究Hotspot源码的时候画了详细的流程图感兴趣的小伙伴可以关注公众号【硬核子牙】回复【start执行流程】获取。