并发编程——线程的启动

本文详细介绍了Java线程的启动,重点讲解了start()方法和run()方法的区别。start()方法用于启动线程,使线程进入就绪状态,等待CPU调度执行,而run()只是一个普通方法。线程状态、start0()的native标记以及为何不能多次调用start()都进行了深入探讨。理解这些概念对于掌握Java并发编程至关重要。
摘要由CSDN通过智能技术生成

前言

今天简单的讲一讲线程的启动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方法运行结束,此线程随即终止。

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不太自律的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值