线程在它的生命周期中会处于各类不一样的状态:新建、等待、就绪、运行、阻塞、死亡。
一、新建
用new语句建立的线程对象处于新建状态,此时它和其余java对象同样,仅被分配了内存。
二、等待
当线程在new以后,而且在调用start方法前,线程处于等待状态。
三、就绪
当一个线程对象建立后,其余线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
四、运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,若是计算机只有一个CPU,那么任什么时候刻只会有一个线程处于这个状态。
只有处于就绪状态的线程才有机会转到运行状态。
五、阻塞状态
阻塞状态是指线程由于某些缘由放弃CPU,暂时中止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程从新进入就绪状态,它才会有机会得到运行状态。
六、死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。
因为java线程调度不是分时的,若是程序但愿干预java虚拟机对线程的调度过程,从而明确地让一个线程给另一个线程运行的机会,能够采用如下的方法
一、调整各个线程的优先级
二、让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态
sleep方法可能抛出InterruptedException
线程休眠后只能在指定的时间后使线程处于就绪状态。(也就是等待cpu的调度)
三、让处于运行状态的线程调用Thread.yield()方法,只会同优先级让步或更高优先级让步(进入就绪状态)
四、让处于运行状态的线程调用另外一个线程的join()方法
当前运行的线程能够调用另外一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另外一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行。vue
经过一下几种途径中的一种,线程能够从被阻塞状态到可运行状态。
一、线程被置于睡眠状态,且已经通过指定的毫秒数。
二、线程正在等待I/O操做的完成,且该操做已经完成。
三、线程正在等待另外一个线程所持有的锁,且另外一个线程已经释放该锁的全部权;(也有可能等待超时。当超时发生时,线程解除阻塞。)
四、线程正在等待某个触发条件,且另外一个线程发出了信号代表条件已经发生了变化。(若是为线程的等待设置了一个超时,那么当超时发生时该线程将解除阻塞。)
五、线程已经被挂起,且有人调用了它的resume方法。不过因为suspend方法已通过时,resume方法也就随之被弃用了,你不该该在本身的代码里调用它。(如今应该用sleep取而代之。)
java
海量视频分享 java dubbo mysql vuemysql