“如果一个线程两次调用 start(),会呈现什么问题?”
如果这个问题出自阿里 p6 岗位第一面的发问,你能答复进去吗?
大家好,我是 Mic,一个工作了 14 年的 Java 程序员。
对于这个问题,波及到线程的生命周期,我把残缺的答复整顿到了 15W 字的面试文档外面大家能够私信我支付。
上面来看看高手的答复。
高手:
在 Java 外面,一个线程只能调用一次 start()办法,第二次调用会抛出 IllegalThreadStateException。
一个线程自身是具备一个生命周期的。
在 Java 外面,线程的生命周期包含 6 种状态。
- NEW,线程被创立还没有调用 start 启动
- RUNNABLE,在这个状态下的线程有可能是正在运行,也可能是在就绪队列外面期待操作系统进行调度调配 CPU 资源。
- BLOCKED,线程处于锁期待状态
- WAITING,示意线程处于条件期待状态,当触发条件后唤醒,比方 wait/notify。
- TIMED_WAIT,和 WAITING 状态雷同,只是它多了一个超时条件触发
- TERMINATED,示意线程执行完结
当咱们第一次调用 start()办法的时候,线程的状态可能处于终止或者非 NEW 状态下的其余状态。
再调用一次 start(),相当于让这个正在运行的线程从新运行,不论从线程的安全性角度,还是从线程自身的执行逻辑,都是不合理的。
因而为了防止这个问题,在线程运行的时候会先判断以后线程的运行状态。
总结
这个问题非常简单。
在面试过程中个别是作为热身题目呈现。
大家只须要答复出那个异样信息就行了。
深度了解线程,对咱们的日常开发工作以及问题诊断工作,都十分有帮忙。
大家记得点赞珍藏加关注!!!
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!