JAVA中的线程状态变化 Thread State Changes

两个视角

操作系统层面:初始、可运行、运行、阻塞、终止
Java层面:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

线程状态变化

1.NEW ——> RUNNABLE 启动线程,如调用start()方法

JAVA中的RUNNABLE包含了可运行、运行、阻塞三种状态(此处的阻塞为操作系统层面的相关阻塞API,和BLOCKED无关)

2.RUNNABLE <——> WAITING

设t线程用synchronized(lock)获取了锁对象

  1. 调用lock.wait(),线程t从runnable状态变为waiting,调用lock.notify()、lock.notifyAll()、t.interrupt()时,线程t有两种可能:1、线程t竞争锁成功,状态由waiting变为runnable 2、竞争锁失败,由waiting变为blocked
  2. 当前线程调用t.join()时,当前线程状态从runnable变为waiting;t线程运行结束或当前线程调用了t.interrupt()时,当前线程从waiting变为runnable
  3. 当前线程调用LockSupport.park()方法时,当前线程状态从runnable变为waiting,调用LockSupport.unpark()或interrupt方法时,当前线程状态从waiting变为runnable
3.RUNNABLE <——>TIMED_WAITING
  1. 有时限的wait
  2. 有时限的join
  3. Thread.sleep(long n)
  4. LockSupport.parkNanos(long nanos)、 LockSupport.parkUntil(long millis)
4.RUNNABLE <——> BLOCKED

t线程如果用synchronized(lock)获取锁失败,就会进入blocked状态,当持有lock锁线程的同步代码块执行完后,就会唤醒所有在lock上等待的线程进行竞争,如果t线程竞争成功,则进入runnable状态,其他失败的线程依然blocked

5.RUNNABLE ——> TERMINATED

线程所有代码执行完毕,进入terminated状态

注:BLOCKED在IDEA Debugger中的名称是MONITOR

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值