线程状态转换总结

1. NEW -> RUNNABLE

  • 创建线程后是 NEW 状态(只是 Java 层面新建的,还没有关联到操作系统实际的线程上),调用线程的 start() 方法会将 Java 线程和操作系统的线程关联起来,进入 RUNNABLE 状态

2. RUNNABLE <-> WAITTING

  • wait/notify
    • 线程 t 获取到锁之后调用 obj.wait(),进入 WAITTING
    • 调用 obj.notify() obj.notifyAll() obj.interrupt() 唤醒线程,线程竞争锁,竞争成功进入 RUNNABLE,竞争失败进入 BLOCKED 状态
  • join
    • 当前线程调用 t.join() 方法,当前线程由 RUNNABLE -> WAITTING,注意是当前线程在 t 线程对象的监视器上等待

问题?当前线程在线程 t 的锁对象上等待,释放时候不需要去抢夺锁,怎么标识不去抢夺?只是需要等待 t 线程运行结束,然后自己继续运行就好了

  • t 线程运行结束或者调用了 t.interrupt() 方法,当前线程 从 WAITTING -> RUNNABLE
  • park/unpark
    • 当前线程调用 LockSupport.park() 回让当前线程由 RUNNABLE -> WAITTING
    • 当前线程调用 LockSupport.unpark(目标线程),或者线程的 interrupt(),会让目标线程从 WAITTING -> RUNNABLE

3. RUNNABLE <-> TIMED_WAITTING

  • wait(timeout)(先获取到对象锁)
    • 调用 wait(timeout) 进入 TIMED_WAITTING 状态
    • timeout 时间到期,从 TIMED_WAITTING -> RUNNABLE
    • 调用 obj.notify() obj.notifyAll() obj.interrupt() 唤醒线程,线程竞争锁,竞争成功进入 RUNNABLE,竞争失败进入 BLOCKED 状态
  • join(timeout)
  •  sleep(timeout)
  • park(timeout)

4. RUNNABLE <-> BLOCKED

  • 运行线程竞争锁失败 synchronized(obj),从 RUNNABLE -> BLOCKED
  • 持有锁 obj 的线程同步代码块执行完毕,释放锁会唤醒阻塞在该对象锁上的所有线程(BLOCKED 状态),线程重新竞争锁,竞争成功由 BLOCKEDE -> RUNNABLE,竞争失败还是 BLOCKED

5. RUNNABLE -> TERMINATED

  • 当前线程执行完毕,进入终止状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值