Thread
多线程并发是一件很美妙的事情,并发的出现使得能够同时运行多个线程,极大的提升了计算机资源的使用效率,并且使得计算机可以同时运行多个程序,而多线程的基础是多个线程的启动,接下来就来好好看看在Java中的线程启动的方式
Thread类的启动方式常见的观点有start()和run()两种方法。
start()方法
1 | //Thread类start()方法 |
含义:
根据start()方法源码,start()方法的执行逻辑为:
- 首先判断线程是否已经启动
- 在等待队列里加入此线程
- 将线程启动标志置位false
- 尝试调用start0()native方法启动线程,将启动标志置为true
- 判断线程是否启动成功,如果没成功,就加入失败队列
分析:
- 启动新线程
- start()方法调用后,并不代表线程就已经启动了,只是加入了队列,并且还要看线程启动器
- start()方法启动后,会有两个线程在执行,一个是主线程,来执行start()方法,第二个就是创建的新的子线程
- 准备工作:
- 新建线程,需要做一些准备工作
- 首先,让新线程进入就绪状态,获取了运行所需要的资源(除了CPU)
- 分配CPU资源后,才能进入到执行状态
- 新建线程,需要做一些准备工作
- 不能重复执行start()方法
- 一旦执行start后,就会获取资源,进入就绪状态,然后进入执行状态,然后终止,进入终止状态后,再也不能进入其他状态。
run()方法
1 | public void run() { |
关于run()方法,最需要理解的一点就是,它只是一个方法,哪个线程调用它执行,就是哪个线程的方法,并不是说执行的哪个线程的方法就是哪个线程的方法。
1 | /** |
常见问题
1、一个线程 两次调用start()方法,会出现什么情况,为什么?
答:start方法开始就进行了检查状态,会直接抛出IllegalThreadStateException()异常
2、既然start()方法会调用run()方法,为什么我们选择调用start()方法,而不是直接调用run()方法呢?
答:调用start()方法才是真正创建一个线程,run方法不会去创建新线程
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/10/concurrent/2020-03-10-startThread/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!