0
点赞
收藏
分享

微信扫一扫

【转】学习笔记-Thread的run()与start()的区别

Fifi的天马行空 2022-02-24 阅读 70

学习内容

调用start()后,线程会被 放到等待队列,等待CPU调度, 并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。

  1. start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
  2. run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
    ————————————————

Thread的run()与start()的区部

代码

demo运行结果:

  1. run()后,直接调用到run方法体。
  2. 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
举报

相关推荐

0 条评论