前置知识:
一个cpu内核只能执行一个线程,如果有多个 线程 ,则根据系统调度,根据分配的时间片执行不同的线程。
因此,一个程序不是一直在执行,而是随着时间片的分配,执行–>停止–>执行循环往复,如此线程就有了不同的状态。
在 java 代码中,线程一共有如下6种状态:NEW RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED。
public class thread implements Runnable
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
下图一共画了7种状态,其中READY和RUNNING都属于RUNNABLE状态。
解析
1、NEW
当我们new Thread(),一个线程就进入了new状态,此时只是初始化了一个实例,不会分cpu时间。
2、RUNNABLE
当调用了thread.start()方法后,该线程才进入ready状态,争抢到cpu时间后,就进入running状态。
当前线程sleep()方法结束
其他线程join()结束
当前线程拿到锁
被其他线程唤醒
3、BLOCKED
进入syncronized方法,没有获取到锁,被阻塞的状态。
4、WAITING
调用wait()方法,如果没有被notify(),会永远等待。
5、TIMED_WAITING
调用wai(time)方法,如果没有被notify,等待一定时间,也可以自动唤醒。
6、TERMINATED
线程执行完成,则进入结束状态。