线程的状态从操作系统层面看有5种,从java api的层面看有6种
一、线程状态5种:从操作系统层面看
从操作系统的角度看,线程的状态有5种: 初始状态,可运行状态,运行状态,阻塞状态,终止状态
初始状态:仅在语言层面创建了线程,还未与操作系统关联
可运行(就绪状态):线程已与操作系统关联,可由cpu调度执行,获取到cpu时间片后就会转到运行状态
运行状态: 获取了cpu时间片正在运行的状态
当cpu时间片用完就会从运行状态转换至可运行状态。
阻塞状态: 当线程调用了阻塞api如文件读写,就会进入阻塞状态。阻塞api执行完后线程就会进入可运行状态.
终止状态: 线程运行结束
二、线程状态6种:从java api层面看
在java的Thread类中定义了java中线程的6种状态
new,Runnable,终止,blocked,waiting,timed waiting
注意java中的runnable状态包括了操作系统层面的可运行,运行,阻塞。
三、线程状态的转换
NEW---> RUNNABLE
调用线程的start方法
Runnable-->WAITING
wait方法,join方法,upark方法,ReentrantLock的await方法
Runnable-->Timed_waiting
带时间的wait,join,await方法,sleep方法
WAITING--->Runnable
notify,notifyAll,unpark,signal方法
Timed_waiting-->Runnable
带时间的方法时间到了后就会结束等待
Runnable --> Blocked
竞争锁失败会进入Blocked状态
Blocked --> Runnable
blocked状态的线程竞争到锁会进入Runnable状态
Runnable --> 终止
线程的代码运行完就会终止