Java线程的5种状态及切换
Java线程的状态与状态间的切换
新建状态(NEW):
当线程对象被创建时,就会进入新建状态。比如说new一个新的进程,Thread thread1 = new MyThread();这个时候线程中的代码还未执行。
就绪状态(Runnable):
新建的线程并不会自动开始运行,要执行线程,要调用线程的start()方法,此后,程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了start()方法此线程立即就会执行,只有在该线程与其它线程竞争CPU时间成功后,才会运行线程。
运行状态(Running):
当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。只有就绪状态的线程才能进入运行状态,也就是说线程要进入运行状态,必须先处于就绪状态。
阻塞状态(Blocked):
处于运行状态的线程由于某种原因,放弃了CPU的使用权,停止了执行,并且进入阻塞状态,在其重新进入就绪状态前,都不能再被CPU调度进入运行状态。
阻塞状态分为三种:
- 等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态,进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒
- 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态
- 其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态
死亡状态(Dead):
线程执行完了或者因异常退出了run()方法,该线程结束生命周期。为了确定线程在当前状态是否还存活,需要使用isAlive方法,如果是可运行或被阻塞,这个方法返回true;如果线程仍旧是new状态且不是可运行的,或者线程死亡了,则返回false。
线程的生命周期:
情况一:new -->runnable-->running-->Dead
情况二:new -->Runnable-->Running-->Blocked-->Runnable-->Running(可能会循环:-->Blocked-->Runnable-->Running)-->Dead
此文用途只是自己学习总结和记录
参考博文:https://blog.csdn.net/ailo555/article/details/82866534