新生状态NEW:new一个对象就进入了新生状态;一旦你开启了新生状态,线程就有了自己的工作空间,工作空间跟主存进行交互。
一般来说有四种原因进入就绪状态RUNNABLE:
1、start()方法;
2、阻塞状态解除重新进入就绪状态;
3、运行过程中调用yield()方法,让出cpu调度,避免一个线程占用资源过多,中断一下重新进入就绪状态;(从运行状态直接到就绪状态)(高风亮节)
4、JVM本身将CPU从本地线程切换到其他线程,那此线程也进入就绪状态,它根据自己的算法来进行切换。
运行状态RUNNABLE:线程一定是从就绪状态被CPU调度到了才会进入运行状态,不会从阻塞状态回到运行状态;(CPU分配好时间片调度到了,注意不是我们人为干涉的,我们干涉不了,CPU去调用,进入运行状态)
导致阻塞状态发生的四种原因:
1、调用sleep()方法,延时,一般来说,sleep()是指抱着“资源”睡觉等待多少毫秒;
2、调用wait()方法,它和sleep()方法的区别是wait()就相当于红绿灯,站在一边,这个资源它不占用给别人去用,sleep()是抱着资源不给别人用;
3、调用join()方法,join:加入、合并、插队,既然插队,那就要待此线程执行完成后,再执行其他线程,其他线程阻塞。
4、有些操作会进入阻塞,比如IO操作,我们有read()、write(),这个也是会阻塞,因为它必须通过操作系统去调度,这个也会进入阻塞。
注:线程状态内部又将阻塞进行区分,sleep是WAITING,join是TIMED WAITING,wait、read、write是BLORKED
一般死亡(TERMINATE)的原因有两个:
1、代码执行完毕,正常结束;
2、这个线程被强制终止;【例:stop()、destroy(),但不建议使用】
注:重点关注阻塞状态和死亡状态。线程死亡以后不能再切换到新生状态。