在操作系统层面,线程有五种状态
初始状态:线程被创建,操作系统为其分配资源。
可运行状态(就绪状态):线程被创建完成,进入就绪队列,参与CPU执行权的争夺。或因为一些原因,从阻塞状态唤醒的线程,重新进入就绪队列,参与CPU时间片的抢夺。
运行状态:线程抢到CPU执行权,进行上下文切换(保存上一条线程执行的数据和环境),执行任务。如果时间片结束,进行上下文切换,重新进入可运行状态。
阻塞状态:某些情况下,线程需要等待其他资源或者进入休眠,进入阻塞状态,等待唤醒。
终止状态:线程进入终止状态,通常发生在线程执行完毕、被中断或被异常退出时。在终止状态中,线程释放了它所占用的资源。
在JVM层面,线程有六种状态(图有点糙....)
初始状态NEW:线程被创建,系统分配资源。
运行状态RUNNABLE:线程被调用start()方法,进入线程任务的执行。
有限期等待TIMED_WAITING:一般是被指定了超时时间,进入等待,一般会在超时时间结束自动返回,也可以在超时时间内被notify()唤醒,或
无限期等待WAITING:表示该线程需要等待其他线程做出一些特定动作(通知或中断),否则会一直等待下去。
阻塞状态BLOCKED:锁阻塞状态,等待锁释放。
终止状态TERMINATED:当线程执行完毕或因异常退出时,它进入终止状态,释放所有资源。
PS:JVM的RUNNABLE也就是操作系统下的可运行状态和运行状态。
这是因为现在的cpu分片时间很很小,一个时间片大概是10-20ms,每条线程每次处于运行中的状态也就是0.01s-0.02s,就要放弃cpu执行权,进入就绪队列。切换的如此之快,区分这两种状态就没有什么意思了。