学习内容
调用start()后,线程会被 放到等待队列,等待CPU调度, 并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。
- start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
- run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
————————————————
Thread的run()与start()的区部
代码
demo运行结果:
- run()后,直接调用到run方法体。
- start() 后,并没有马上执行run方法体,而是生命周期置为RUNNABLE(就绪状态),通过JVM,线程Thread才调用到run方法体。
package threadpool
import java.text.SimpleDateFormat
import java.util.*
/**
* Thread的run()与start()的区别
*/
class ThreadTest {
companion object {
var mThread: Thread? = null
@JvmStatic
fun main(args: Array<String>) {
println("${getCurTime()}: 1. 实例化 Thread, 查看生命周期:")
mThread = Thread(Runnable {
println("${getCurTime()}: ---->run函数体方法被回调")
})
println("${getCurTime()}: -->查看${mThread?.name} 生命周期: ${mThread?.state}")
println("${getCurTime()}: 2. 调用Thread.run()函数, 生命周期无改变,再触发run函数体方法的回调。")
mThread?.run()
println("${getCurTime()}: -->查看${mThread?.name} 生命周期: ${mThread?.state}")
println("${getCurTime()}: 3. 调用Thread.start()函数后,生命周期会变成RUNNABLE,再触发run函数体方法的回调")
mThread?.start()
println("${getCurTime()}: -->查看${mThread?.name} 生命周期: ${mThread?.state}")
}
fun getCurTime(): String {
val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
return df.format(Date())
}
}
}
运行结果
2022-02-24 22:35:38: 1. 实例化 Thread, 查看生命周期:
2022-02-24 22:35:38: -->查看Thread-0 生命周期: NEW
2022-02-24 22:35:38: 2. 调用Thread.run()函数, 生命周期无改变,再触发run函数体方法的回调。
2022-02-24 22:35:38: ---->run函数体方法被回调
2022-02-24 22:35:38: -->查看Thread-0 生命周期: NEW
2022-02-24 22:35:38: 3. 调用Thread.start()函数后,生命周期会变成RUNNABLE,再触发run函数体方法的回调
2022-02-24 22:35:38: -->查看Thread-0 生命周期: RUNNABLE
2022-02-24 22:35:38: ---->run函数体方法被回调
Process finished with exit code 0