【JMM】Thread源码分析之线程状态及常用方法
线程的状态转换
通过源码分析,线程的状态大部分都是用虚拟机设置的,只有在线程新建而未启动的时候,线程的状态值为0,处于State.NEW状态。
- NEW
新建状态,线程对象新建时的状态。 - RUNNABLE
就绪状态,调用了线程的start()方法后,随时等待CPU调度。 - BLOCKED
阻塞状态,等待synchronized 锁。 - WAITING
当调用了Object.wait,Thread.join,LockSupport.park方法后(没有超时设定),挂起当前线程。 - TIMED_WAITING
调用了Thread.sleep,Object.wait,Thread.join,LockSupport.parkUntil,LockSupport.parkNanos有超时设定的方法,挂起当前线程一段时间。 - TERMINATED
线程执行结束。
常用方法
currentThread()
获取当前线程的引用,静态方法。
1 | /** |
sleep(long millis)
睡眠一段时间,让出CPU,线程处于TIMED_WAITING状态。即不参与CPU竞争,即使是sleep(0)。
1 | /** |
yield()
线程调用yield()方法后,线程还是属于RUNNANLE状态,也就是会重新竞争CPU,可能前脚刚让出CPU,后脚就抢回来了。
1 | /** |
isAlive()
判断虚拟机新创建的线程是否存活。
1 | /** |
#####join(long millis)
该方法等待this thread终止,最多等指定的时间,如果指定时间为0,则一直等。即线程可能处于WAITING或TIMED_WAITING状态。
1 | /** |
以前分析JAVA线程的时候,都会有个running状态,在源码中,RUNNABLE状态即包括了准备被CPU调用状态和正在执行状态。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!