Thread的run()与start()的区别
2019-08-01 本文已影响0人
12313凯皇
开门见山,start
方法是用来启动一个线程的,而run
方法执行的才是你写的那些东西,方法run()
也称为线程体。
-
start()
方法来启动线程,真正实现了多线程运行。这时无需等待run
方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread
类的start()
方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread
类调用方法run()
来完成其运行操作的, 这里方法run()
称为线程体,它包含了要执行的这个线程的内容,run
方法运行结束, 此线程终止。然后CPU
再调度其它线程。 -
run()
方法当作普通方法的方式调用。程序还是要顺序执行,要等待run
方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
记住:多线程就是分时利用CPU
,宏观上让所有线程一起执行 ,也叫并发。
为了更好的理解run
与start
之间的区别,下面再来补充一下线程的一些其他知识:
线程的五种状态
-
创建状态
在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 -
就绪状态
当调用了线程对象的start
方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 -
运行状态
线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run
函数当中的代码。 -
阻塞状态
线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep
,suspend
,wait
等方法都可以导致线程阻塞。 -
死亡状态
如果一个线程的run
方法执行结束或者调用stop
方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start
方法令其进入就绪。
实现并启动线程的方法
- 写一个类继承自
Thread
类,重写run
方法。用start
方法启动线程。 - 写一个类实现
Runnable
接口,实现run
方法。用new Thread(Runnable target).start()
方法来启动。
多线程原理
相当于玩游戏机,只有一个游戏机(cpu
),可是有很多人要玩,于是,start
是排队!等CPU
选中你就是轮到你,你就run()
,当CPU
的运行的时间片执行完,这个线程就继续排队,等待下一次的run()
。
调用start()
后,线程会被放到等待队列,等待CPU
调度,并不一定要马上开始执行,只是将这个线程置于可运行状态。然后通过JVM
,线程Thread
会调用run()
方法,执行本线程的线程体。先调用start
后调用run
,这么麻烦,为了不直接调用run
?就是为了实现多线程的优点,没这个start
不行。