-
并发编程——线程的启动
前言
今天简单的讲一讲线程的启动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方法运行结束,此线程随即终止。
出处:https://www.cnblogs.com/code-monkey-007/p/15120994.html