线程的状态从操作系统层面看有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 --> 终止

线程的代码运行完就会终止