线程的生命周期状态

自己学习时总结的线程的状态

第一步:

     新建状态:使用new关键字新建线程,此时处于新建状态;

第二步:

     就绪状态:当调用了该线程的start()方法,线程启动,处于就绪状态,但是不一定执行;

第三步:

      运行状态:需要考操作系统cup的调度执行,如果操作系统是抢占式调度,当线程抢占到了cup的执行权限,线程开始执行;如果是分时调度系统,等待操作系统分配时间片给线程,线程运行;在一个时间片执行完毕之后,线程将cup资源释放,回到就绪状态,等待下一次获得cup的执行权限;

第四步:

      死亡状态:如果线程中的run()方法执行完毕,此时线程结束,即变为死亡状态,不可以再次调用start()方法重新启动线程,只能在一次new新建;

那么比较复杂的是运行状态和就绪状态之间呢,会发生线程的阻塞状态,是介于运行状态和就绪状态之间的;

注:当进程此刻cup时间片用完,线程从运行状态直接到就绪状态,不是进入阻塞状态;

来看一下,有哪些情况,程序会从运行状态到阻塞状态呢!

     运行状态--->阻塞状态:

  1. 线程中调用了sleep()方法;
  2. 线程执行过程中有另外一个线程加入进来,优先执行加入进来的进程;
  3.  程序中需要用户的输入,线程会阻塞等待用户的输入才能继续执行;

上面是进入到阻塞状态,那么阻塞状态如何恢复到就绪状态呢?这里需要注意阻塞状态不会直接转入运行状态,只能转换到就绪状态,等待cup调度 

     阻塞状态--->就绪状态:

  1. sleep()时间结束;
  2. 加入进来的线程执行完毕;
  3. 用户控制台输入数据完毕;
  4. 调用了interrupt()方法被打断此刻的阻塞状态;

这里呢还有另外一种从运行状态到就绪状态的情况,就是线程间的通信过程中发生的,我们来看一下 ;

     运行状态--->阻塞状态:

    1.当程序执行加锁的代码块时,即执行synchronized修饰的方法抑或是synchronized包裹的代码块时,如果发现此时代码块锁属于当前自己的线程,那么执行代码块;如果自己没有锁,就不能执行加锁代码块,此时该线程进入锁池等待其他线程将锁资源释放,如果等到锁资源,此刻进入就绪状态,等待cpu调度;

    2.当锁对象调用了wait()方法,此时该线程进入等待队列等待其他进程的唤醒操作,当其他程序执行了notify()、notifyAll()或者interrupt()方法时,此时线程由等待队列转入锁池,开始执行1中的一系列操作;

大家可以结合我画的图片进行理解 。

 

这就是我对线程几个状态的初步认识,如有欠缺,请大家指出,谢谢! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值