浅谈JAVA线程状态

**

浅谈JAVA线程状态

**

关于JAVA线程的状态,我专门去看了下JDK源码,其中就有这样一段:

在这里插入图片描述在这里插入图片描述在这里插入图片描述上面说的很清楚,JAVA线程一共有六种状态,和操作系统线程并不是一一对应的,分别是:

NEW 新建状态

  1. new Thread() 会创建一个线程,此时为新建状态

RUN 运行状态

  1. Thread.start()方法,线程进入运行状态(operate system称就绪状态, JAVA中就绪和运行都是RUN)
  2. Thread.sleep(long mill) 方法时间结束,从超时等待状态到运行状态
  3. Object.notify() 正在等待Object对象锁的线程,当另外一个线程调用该锁对象的notify方法时,在该锁上等待的一个线程进入运行状态,抢占锁资源,抢不到,进入阻塞状态
  4. 当该线程调用Thread.sleep(long mill)时间还未结束时,有其他线程调用了该线程的interrupt()时,该线程会结束sleep,并抛出InterruptedException异常,并进入RUN状态

BLOCKED 阻塞状态

  1. 准备进入synchronized块或方法,但并未获得对象锁
  2. 已经进入synchronized块或方法,在synchronized块或方法里调用了锁对象的wait()方法,释放了锁资源,其他线程调用了该对象锁的notify或nitifyAll方法,唤醒一个或所有在该对象锁上等待的线程,则线程进入阻塞状态,等待锁资源
  3. 进入超时等待的线程,超时时间到了,自动进入阻塞状态,不用等被其他线程唤醒

WARTING 等待状态

  1. 目标线程调用其他线程的Thread.join(),目标线程进入等待状态
  2. 目标线程调用Thread.wait()

TIMED_WARTING 超时等待状态

  1. 目标线程调用Thread.wait(long mill)
  2. 目标线程调用其他线程的Thread.join(long mill)
  3. 目标线程调用Thread.sleep(long mill)

TERMINATED 结束状态

  1. 目标线程执行完成
  2. 目标线程调用了Thread.stop() (已不建议使用)

notify 和notifyAll 都是Object类的方法,下面介绍一下他们之间的区别:
notify: 唤醒在该对象锁上等待的一个线程,使该线程进入阻塞状态,等待锁资源
notifyAll:唤醒在该对象锁上等待的所有线程,全部进入阻塞状态,等待锁资源

细心的朋友可能会看到,源码中还有LockSupport 类的park()和unpark()方法
是的,但这个方法底层用的是UnSafe 对象,他不是JDK规范里面的,看他的名字就知道它不安全,感兴趣的朋友可以自己去看看源码,这里就不多讲了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值