java线程有六种状态:
在Thread类里有一个枚举类型State:
NEW: 新建状态
RUNNABLE: 执行状态(run ready)
BLOCKED: 阻塞状态
WAITING: 等待状态
TIMED_WAITING: 定时等待状态
TERMINATED: 结束状态
大致归类定义:
线程自身状态:
NEW : 新建一个线程,未做任何操作的时候线程处于此状态
RUNNABLE:线程被CPU挑选执行或者在CPU内切换执行时等待都属于此状态
TERMINATED:线程结束时的状态
线程与其他线程有关联的状态:
BLOCKED:资源被其他线程占用,等待资源的时候处于此状态
WAITING:线程获取到资源,暂停执行状态,等待其他线程通知。暂停时间无限制,
TIMED_WAITING:同WAITING,有时间限制
举例说明:
在有个镇上只有一家饭店(这个饭店就是CPU),假设饭店同一时间只提供一个人就餐(在同一 时间段 内,电脑CPU只能处理一个线程(线程A),张三和李四都饿了,都需要去吃饭(吃饭这个决定就是NEW状态,张三吃饭属于线程A,李四吃饭属于线程B),他们来到饭店(线程启动),张三发现饭店没人就餐,就进去就餐(线程A进入RUNNABLE状态),进入餐馆后有可能上菜需要等待一会儿(在RUNNABLE状态下的线程可能会处于等待状态, 因为它正在等待一些系统资源的释放),上菜后张三就餐。这个时候李四来了,李四发现餐馆有人在使用了,就在餐馆外等待(BLOCKED,因为资源被占用导致等待),张三吃饭的时候,老板说卫生局的要来进行卫生检查(线程C join),麻烦你先等一下,张三只好等着(线程A处于WAITING状态),卫生局的检查完毕,通知张三你可以继续用餐了(线程A唤醒继续执行),张三吃完饭后走了(线程A进入TERMINATED状态),这个时候李四可以进去用餐了(线程B解除BLOCKED,进入RUNNABLE),李四吃完饭后也离开了饭店(线程B进入TERMINATED状态);
注:如果老板说你等两分钟,如果还没有检查好的话,你就走吧(就是TIMED_WAITING),张三则在两分钟之内没有接到老板的通知就自行离开了。