“如果一个线程两次调用 start(),会呈现什么问题?”
如果这个问题出自阿里 p6 岗位第一面的发问,你能答复进去吗?
对于这个问题,波及到线程的生命周期,我把残缺的答复整顿到了 15W 字的面试文档外面大家能够私信我支付。
上面来看看高手的答复。
高手:
在 Java 外面,一个线程只能调用一次 start() 办法,第二次调用会抛出 IllegalThreadStateException。
一个线程自身是具备一个生命周期的。
在 Java 外面,线程的生命周期包含 6 种状态。
- NEW,线程被创立还没有调用 start 启动
- RUNNABLE,在这个状态下的线程有可能是正在运行,也可能是在就绪队列外面期待操作系统进行调度调配 CPU 资源。
- BLOCKED,线程处于锁期待状态
- WAITING,示意线程处于条件期待状态,当触发条件后唤醒,比方 wait/notify。
- TIMED_WAIT,和 WAITING 状态雷同,只是它多了一个超时条件触发
- TERMINATED,示意线程执行完结
当咱们第一次调用 start() 办法的时候,线程的状态可能处于终止或者非 NEW 状态下的其余状态。
再调用一次 start(),相当于让这个正在运行的线程从新运行,不论从线程的安全性角度,还是从线程自身的执行逻辑,都是不合理的。
因而为了防止这个问题,在线程运行的时候会先判断以后线程的运行状态。
总结
这个问题非常简单。
在面试过程中个别是作为热身题目呈现。
大家只须要答复出那个异样信息就行了。
深度了解线程,对咱们的日常开发工作以及问题诊断工作,都十分有帮忙。