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

网站建设长沙做网站赚钱流程

网站建设长沙,做网站赚钱流程,内蒙古包头网站建设,wordpress平铺图片【面试题】深度解析Java多线程中的 run() 与 start() 有什么区别? 大多数人的回答 start() run() 深入底层源码的解析 run() 与 start() 为什么我们不能直接调用 run() 方法? 如何证明 start() 会调用 run() 方法? JVM -> OS执行全…

【面试题】深度解析Java多线程中的 run() 与 start() 有什么区别?

大多数人的回答

start()

run()

深入底层源码的解析 run() 与 start() 

为什么我们不能直接调用 run() 方法?

如何证明 start() 会调用 run() 方法?

JVM -> OS执行全流程 !!!

完整流程图 


【面试题】深度解析Java多线程中的 run() 与 start() 有什么区别?

大多数人的回答

下面这个是我2022年6月写的文章,当时刚刚学多线程,所以对这个问题的理解很片面~~~  

下文是现在2022.11.30,我对其新的见解!站在JVM底层源码的角度来解析这个问题!!! 

Java多线程编程(一)——线程的3种实现方法_面向鸿蒙编程的博客-CSDN博客https://blog.csdn.net/weixin_43715214/article/details/122329166

start()

start() 方法是启动线程,并由 JVM 来调用线程的 run() 方法执行,是真正的多线程!

这时此线程是处于就绪状态, 并没有运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面的代码。 

run()

run() 方法里面封装的是需要被线程执行的逻辑代码,如果直接调用run()方法和调用普通方法没有区别(单线程)!

run() 可以重复调用,而 start()只能调用一次


深入底层源码的解析 run() 与 start() 

为什么我们不能直接调用 run() 方法?

如果直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

调用 start 方法方可启动线程并使线程进入就绪状态;而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。 

如何证明 start() 会调用 run() 方法?

我们可以用一段简单的代码,通过调试来证明!

public class Demo {public static void main(String[] args) {Thread t = new Thread(() -> {System.out.println("dsfdsfds");});t.start();}
}

start()方法上面打一个断点 

run()方法上面打一个断点  

通过调试发现,确实是会跳到run()里面! 但是具体怎么进去的?在IDEA中是看不出来的!因为这里是由JVM(C++写的)编写的,如果我们想要搞清楚它们是要去阅读JVM源码的!

JVM -> OS执行全流程 !!!

(1)使用 new Thread() 创建一个线程,然后调用 start0()方法 进行 Java 层面的线程启动

当我们自己写的代码使用 start() 方法的时候,表示启动这个线程,在该方法的内部会去调start0() 这个本地方法

(2)调用本地方法start0(),去调用 JVM 中的JVM_StartThread方法进行线程创建和启动

public
class Thread implements Runnable {private static native void registerNatives();static {registerNatives();}...
}

start0() 会去调 JVM_StartThread 进行线程创建、启动,那它们是如何扯上关系的???

在 Java 中的 Thread 类,当我们初始化的时候(new的时候)会先执行静态代码块里的方法!

也就是说,会先调一下 registerNatives() 本地方法,如下图:

(3)调用 new JavaThread(&thread entry, sz) 进行线程的创建,并根据不同的操作系统平台调用对应的 os::create thread 方法进行线程创建

此时操作系统会切换为内核态!!! 

(4)新创建的线程状态为 lnitialized(初始化状态),调用了sync->wait() 的方法进行等待(先阻塞!!!),等到被唤醒才继续执行 thread->run()

等待JVM将其唤醒

(5)调用 Thread::start(native thread) 方法进行线程启动,此时将线程状态设置为RUNNABLE,接着调用 os::start_thread(thread),根据不同的操作系统选择不同的线程启动方式

(6)线程启动之后状态设置为RUNNABLE,并唤醒第4步中等待的线程,接着执行 thread->run() 的方法

(7) JavaThread::run()方法会回调第1步new Thread中复写的run()方法。

完整流程图 

 Thread#start()源码分析 流程图模板_ProcessOn思维导图、流程图

纵观整个流程,Java Thread --> JVM JavaThread --> OS Thread,在JVM操作OS创建线程时,会涉及到用户态到内核态的切换!!!这也是Java线程是一个很“”的操作的原因!!!

同样这也是Java线程池为什么优于多线程的原因!为什么要有线程复用机制的原因!!!

具体看这里 ↓ ↓ ↓

【并发】深入理解Java线程的底层原理_面向鸿蒙编程的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/weixin_43715214/article/details/128099128

http://www.dtcms.com/wzjs/820213.html

相关文章:

  • 网站权重查询网站建设主要做什么
  • 月子中心网站设计呢图网站
  • 在线编辑图片的网站有哪些网页设计有什么用
  • 一级a做爰片免费网站 视频网站建设 维护 运营情况报告
  • 网站设计公司 宁波如何做免费的网站
  • 自己搭建服务器 发布网站 域名如何申请黑龙江建设网网上办事大厅
  • 教育培训网站运营网站销售队伍建设与管理
  • 兖州那有做网站的网站开发实战第二章
  • 关于做网站的策划书在线玩网页游戏
  • 网站开发电脑内存要多少钱用插件做的炫酷网站
  • 网站为什么需要空间国外html5特效网站
  • 标准版网站制作工程建设标准下载网站
  • 云南城市建设职业学院成绩查询网站室内设计软件免费下载
  • 2345电视剧网站免费win10最强优化软件
  • 推荐几个网站图片网站交互设计的方法和技巧
  • 优秀地方门户网站系统公共资源交易中心工作总结
  • 登录自己网站的后台 wordpress广州网站开发网络公司
  • 建网站详细步骤公司装修费用怎么做账
  • 网站平台维护网站换友链平台
  • 机票酒店 网站建设福建seo关键词优化外包
  • 网站 权重做企业网站收费多少钱
  • 网站图片尺寸网站营销网站营销推广
  • 惠州微网站推广方案怎么学建设网站
  • 江苏城乡建设网站wordpress xiu5.3
  • 济南定制网站建设网站开发和设计实训
  • 做办公用品网站资料怎么收集手机微网站与微官网
  • 一个小型购物网站开发深圳高端营销网站模板
  • 南宁自助模板建站自己做网站可行吗
  • 方便做流程图的网站高端网站建设那公司好
  • 南沙网站建设方案个人网站怎么注册