线程的生命周期和触发的机制
![](https://img2022.cnblogs.com/blog/1120402/202208/1120402-20220817101553219-796709016.png)
java线程的五种基本状态
1.新建状态(new):当线程对象创建后,即进入新建状态,如Thread t=new MyThread();
2.就绪状态(Runnable):当调用线程对象的start()方法(t.start()),线程即进入就绪状态,处理就绪状态线程,只是说明当前线程做好了准备,随时准备等待CPU调度执行,并不是说执行了t.start()就会立即执行
3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时的线程才开始被执行,即进入到运行状态,PS:就绪状态是进入运行状态的唯一入口,也就是说,线程想进入运行状态,必须先处于就绪状态
4.阻塞状态(Blocked):处于运行状态的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入就绪状态,才有机会再次被CPU调用进入就绪状态,根据阻塞产生的原因不同,阻塞状态又可以分为三种:
等待阻塞:运行状态线程执行wait()
同步阻塞: 线程在获取synchronized同步锁失败(因为锁被其他线程所占用),它会同步进入同步锁阻塞
其他阻塞:通过调用线程的sleep()或join()或发送I/O请求时,线程会进入阻塞状态,当sleep()状态超时、join()等待超时线程终止或者超时,或者I/O处理完成完毕,线程重新转入就绪状态
5.死亡状态:线程执行完或者因异常退出了run()方法,该线程生命周期
就绪状态转为运行状态:当前线程获取处理器资源
运行状态转为就绪状态:当前线程调用了yeid()或者在运行过程中失去了处理器资源
运行状态转为死亡状态:当前线程执行完毕或出现异常
ps:当调用线程的yield()方法时,线程从运行状态转换为就绪状态,但接下来CPU调度就绪状态中的哪个线程具有一定的随机性,因此,可能会出现A线程调用了yield()方法后,接下来CPU仍然调度了A线程的情况。