一张图搞懂多线程的六种状态
在很多网上流传的教学视频种,有说线程有5种状态的、7种状态的。
实际上在java的Thread类中,已经明确枚举了线程的6种状态。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
在JDK中,线程的就绪状态和运行中的状态被统称为runnable运行状态。
线程被创建,并调用start()方法后,进入runnable状态,获得锁的情况下,就在就绪状态等待被CPU调用进入真正的执行状态。在执行过程中,由于CPU时间片的原理,执行一段时间后,有可能就被cpu挂起,再次进入就绪状态,等待被cpu调用。
Thread.yield()只是在runnable的状态中,让线程放弃cpu资源,重新进入就绪状态。也许很快又被cpu调度进行执行。
线程在runnable状态中,被调用
带超时时间的sleep、wait、join方法和LockSupport.parkNanos();LockSupport.parkUntil();
线程进入TIMED_WAITING 超时等待状态。这个超时等待按设定的时间进行等待,期间如果没有被唤醒,就根据获没获得锁进入runnable或blocked状态。其中sleep方法在调用的时候是没有释放锁的,所以,睡醒后可以直接拿着锁进入就绪状态等待cpu调度。
被notify唤醒后进入阻塞状态开始争夺锁。
Thread.sleep(long);
o.wait(long);
t.join(long;
LockSupport.parkNanos();
LockSupport.parkUntil();
线程在runnable状态中,被调用
无参的wait、join方法和LockSupport.park()
线程进入WAITING 等待状态。
被notify唤醒后进入阻塞状态开始争夺锁。
o.wait();
t.join();
LockSupport.park();
期间,程序运行结束,或在任意一个状态中抛出异常,直接进入TERMINATED终止状态。
最后,上图~