目录
启动线程的正确姿势
Start方法原理解读
Run方法原理解读
常见问题
启动线程的正确姿势
- start()与run()方法的比较
- 测试结果可以看出,runnable.run()方法是由main线程执行的,而要子线程执行就一定要先调用start()启动新线程去执行
- run方法并不能成功启动线程,而start能
Start方法原理解读
- 方法含义:启动新线程
- 准备工作:不能重复调用start
- 结果:抛出非法的线程异常
- 源码解析:
- 含义:
- 根据start()方法源码,start()方法的执行逻辑为:
- 首先判断线程是否已经启动
- 在等待队列里加入此线程
- 将线程启动标志设置为false
- 尝试调用start0()native方法启动线程,将启动标志置为true
- 判断线程是否启动成功,如果没成功,就加入失败队列
- 分析:
- 启动新线程:
- start()方法调用后,并不代表线程就已经启动了,只是加入了队列,并且还要看线程启动器
- start()方法启动后,会有两个线程在执行,一个是主线程,来执行start()方法,第二个就是创建的新的子线程
- 准备工作:
- 新建线程,需要做一些准备工作
- 首先,让新线程进入就绪状态,获取了运行所需要的资源(除了CPU)
- 分配CPU资源后,才能进入到执行状态
- 不能重复执行start()方法
- 一旦执行start后,就会获取资源,进入就绪状态,然后进入执行状态,然后终止,进入终止状态后,再也不能进入其他状态
Run方法原理解读
- 源码解析:
- 关于run()方法,最需要理解的一点就是,它只是一个方法,哪个线程调用它执行,就是哪个线程的方法,并不是说执行的哪个线程的方法就是哪个线程的方法
常见问题
- (1)一个线程 两次调用start()方法,会出现什么情况,为什么?
- 答:start方法开始就进行了检查状态,会直接抛出IllegalThreadStateException()异常
- (2)既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢?
- 答:调用start()方法才是真正创建一个线程,run方法不会去创建新线程