线程有几种状态:
1.产生(new):线程已经产生,只是放在内存中啥事都不干。
2.可运行(runnable):在调用了start方法到它获得系统给它分配了时间片之前,或者时间片用完了但还没执行完。
3.运行(running):获得了时间片,正在运行。
4.死亡(dead):执行完成
5.阻塞(block):不可运行状态都是由可运行状态转变来的。一个处于可运行状态的线程,如果遇到挂起 (suspend)操作、睡眠(sleep)操作或者等待(wait)操作,就会进入不可运行状态。另外,如果 一个线程是和I/O操作有关的,那么,在执行I/O指令时,由于外设速度远远低于处理器速 度而使线程受到阻塞,从而进入不可运行状态,只有外设完成输入/输出之后,该线程才会自 动回到可运行状态。线程进入不可运行状态后,还可以再回到可运行状态。通常有三种途径 使其恢复到可运行状态。
通过睡眠(sleep)操作而进入不可运行状态的线程会在过了指定睡眠时间以后自动恢 复到可运行状态;由于I/O阻塞而进入不可运行状态的线程在外设完成I/O操作后,自动 恢复到可运行状态。
通过wait()方式进入第五种方式的线程可以用通知(notify或notiyA11)方法使其转到第二种状态。
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列)。并且在某一时刻cpu只为ready queue中位于队列头部的线程服务。
sleep(int millis):应该是第五种状态,但在指定的毫秒数到了之后又会回到就绪队列中即第二种状态。
yield():直接从第三种状态拉到第二种状态,不管时间片完没有。
suspend(),resume():同过suspend方法可以使线程进入block状态,进入该状态后除非使用resume使其转至runnable,否则它不会回到runnable状态。执行了suspend方法后的线程他不会释放它的锁标识