前言今天简单的讲一讲线程的启动start方法 。
如果对于线程的创建方式不太了解,推荐观看并发编程——认识java里的线程
对于线程状态及其切换不了解的,推荐观看并发编程——Java线程的6种状态及切换
线程的启动在并发编程——认识java里的线程中我们有讲过线程的创建,我们启动线程的时候使用的是start方法 。
那么我们就先来看看start方法,简单的附上一些源码:

文章插图
关于threadStatus源码:

文章插图
通过代码可以看到就是threadStatus就是记录Thread的状态,初始线程默认为0.
加入线程组,然后调用start0()
start0 被标记成 native ,也就是本地方法,使用其他语言编写的方法,这些代码在jdk代码中,并不需要我们去实现或者了解 。
为什么 start0() 会标记成 native ?
这个要从 Java 跨平台说起,看下面这张图:

文章插图
start() 方法调用 start0() 方法后,该线程并不一定会立马执行,只是将线程变成了可运行状态 。具体什么时候执行,取决于 CPU ,由 CPU 统一调度 。
我们又知道 Java 是跨平台的,可以在不同系统上运行,每个系统的 CPU 调度算法不一样,所以就需要做不同的处理,这件事情就只能交给 JVM 来实现了,start0() 方法自然就表标记成了 native 。
start()方法不能使用多次
通过刚刚源码分析,就知道start方法刚开始就检查线程状态,当线程创建后或结束了,该状态就不同于初始化状态就会抛出IllegalThreadStateException异常 。
注意:start方法是被synchronized修饰的方法,可以保证线程安全 。
由jvm创建的main方法线程和system组线程,并不会通过start来启动 。
这个地方有的面试官就会问你这个线程内部有一个run方法,还是就是通过Thread提供的start()这两个有什么区别呢?启动线程为什么要使用start()方法?
run方法:
只是Runnable对象中一个普通的方法而已,直接调用就相当于于调用我们的普通方法,程序中不会创建新的线程,还是只有一个主线程,代码执行还是按照顺序执行,也就是相当于等待run方法执行完,所以使用run方法不是调用启动线程的方式 。
start方法:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码 。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止 。
【java并发编程之线程同步 并发编程——线程的启动】感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流 。如果这篇文章帮助到了你,欢迎点赞
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
