自己学习时总结的线程的状态
第一步:
新建状态:使用new关键字新建线程,此时处于新建状态;
第二步:
就绪状态:当调用了该线程的start()方法,线程启动,处于就绪状态,但是不一定执行;
第三步:
运行状态:需要考操作系统cup的调度执行,如果操作系统是抢占式调度,当线程抢占到了cup的执行权限,线程开始执行;如果是分时调度系统,等待操作系统分配时间片给线程,线程运行;在一个时间片执行完毕之后,线程将cup资源释放,回到就绪状态,等待下一次获得cup的执行权限;
第四步:
死亡状态:如果线程中的run()方法执行完毕,此时线程结束,即变为死亡状态,不可以再次调用start()方法重新启动线程,只能在一次new新建;
那么比较复杂的是运行状态和就绪状态之间呢,会发生线程的阻塞状态,是介于运行状态和就绪状态之间的;
注:当进程此刻cup时间片用完,线程从运行状态直接到就绪状态,不是进入阻塞状态;
来看一下,有哪些情况,程序会从运行状态到阻塞状态呢!
运行状态--->阻塞状态:
- 线程中调用了sleep()方法;
- 线程执行过程中有另外一个线程加入进来,优先执行加入进来的进程;
- 程序中需要用户的输入,线程会阻塞等待用户的输入才能继续执行;
上面是进入到阻塞状态,那么阻塞状态如何恢复到就绪状态呢?这里需要注意阻塞状态不会直接转入运行状态,只能转换到就绪状态,等待cup调度
阻塞状态--->就绪状态:
- sleep()时间结束;
- 加入进来的线程执行完毕;
- 用户控制台输入数据完毕;
- 调用了interrupt()方法被打断此刻的阻塞状态;
这里呢还有另外一种从运行状态到就绪状态的情况,就是线程间的通信过程中发生的,我们来看一下 ;
运行状态--->阻塞状态:
1.当程序执行加锁的代码块时,即执行synchronized修饰的方法抑或是synchronized包裹的代码块时,如果发现此时代码块锁属于当前自己的线程,那么执行代码块;如果自己没有锁,就不能执行加锁代码块,此时该线程进入锁池等待其他线程将锁资源释放,如果等到锁资源,此刻进入就绪状态,等待cpu调度;
2.当锁对象调用了wait()方法,此时该线程进入等待队列等待其他进程的唤醒操作,当其他程序执行了notify()、notifyAll()或者interrupt()方法时,此时线程由等待队列转入锁池,开始执行1中的一系列操作;
大家可以结合我画的图片进行理解 。
这就是我对线程几个状态的初步认识,如有欠缺,请大家指出,谢谢!