线程的同步状态

线程的各个流程之间转换的关系图:

说明 :

线程的同步状态主要包含5种状态的转换:

1. 初始状态(New)         : 也就是线程对象被新建后就进入初始状态。例如,Thread thread = new Thread()。

2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,调用该对象的start()方法启动了线程。此时线程就进入到了就绪状态。注意 :并不是线程进入到就绪状态就一定会马上执行,线程具体能否执行完全看CPU的选择。

3. 运行状态(Running) : 线程获取到了CPU使用权限进行执行。

4. 阻塞状态(Blocked)  : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。阻塞的情况分三种: 

    01) 等待状态 -- 通过调用线程的wait()方法,让线程等待某工作的完成。

    02) 同步阻塞 -- 线程获取同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

    03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

注意:线程无法从阻塞状态直接恢复到执行状态,需要先回到就绪状态。

5. 终止状态(Dead)    : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

关于就绪、执行、阻塞状态的变化几种情况:

  1. 调用sleep、join方法可以引起阻塞,不会释放锁
    sleep方法是休眠时间过后,线程重新回到就绪状态
    join方法,比如在线程t1里调用线程t2.join(),紧接着调用线程t3.join(),那么当代码执行到t2.join()后,就相当于在线程t1里面调用了一个方法一样,因此必须要等到t2执行完后才会执行t3,然后等到t3执行完后线程t1才继续执行.因此在日常编码中可以通过join()方法来控制线程执行的先后顺序
  2. 调用Thread.yield()方法,不会阻塞线程,而是让线程直接从执行状态转为就绪状态。但是当前线程让出资源会给优先级等于或高于当前线程的线程。因此有可能调用了yield后又继续执行。
  3. 因为方法、对象、代码块用了锁,造成线程执行的时候需要先获取锁而阻塞
  4. 因为线程当前占有锁,但是调用了wait(隐式锁里调用)/await(显式锁的Condition调用)引起释放了锁引起阻塞, 需要通过在其他地方调用notify(notifyAll都是隐式锁使用)/signal(signalAll显式锁的Condition调用)来唤醒线程,当时唤醒线程过后,线程仍然是阻塞的,因为此时线程还需要获取到锁,当获取到锁后,线程才由阻塞状态变化为就绪状态

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值