线程的状态

  1. 新建 New
  2. 可运行 Runnable(分为就绪状态Ready和运行中状态Running)
  3. 阻塞 Blocked
  4. 等待 Waiting
  5. 等待(时间)Timed Waiting
  6. 结束 Terminated

image

线程的生命周期

1. New

一个新的线程被创建,还没开始运行。

2. Runnable

一个线程准备就绪,随时可以运行的时候就进入了 Runnable 状态。

Runnable 状态可以是实际正在运行的线程,也可以是随时可以运行的线程。

多线程环境下,每个线程都会被分配一个固定长度的CPU计算时间,每个线程运行一会儿就会停止让其他线程运行,这样才能让每个线程公平的运行。这些等待CPU和正在运行的线程就处于 Runnable 状态。

3. Blocked

例如一个线程在等待 I/O 资源,或者它要访问的被保护代码已经被其他线程锁住了,那么它就在阻塞 Blocked 状态,这个线程所需的资源到位后就转入 Runnable 状态。

synconized关键字导致的阻塞,基于jvm 堆中的object header对象头实现

4. Waiting(无限期等待)

如果一个线程在等待其他线程的唤醒,那么它就处于 Waiting 状态。以下方法会让线程进入等待状态:

  • Object.wait() object.notify
  • Thread.join() 释放锁
  • LockSupport.park() AQS原理会调用 不释放锁
  • 其他阻塞 如NIO流阻塞

5. Timed Waiting(有期限等待)

无需等待被其他线程显示唤醒,在一定时间后有系统自动唤醒。

以下方法会让线程进入有限等待状态:

  • Thread.sleep(sleeptime)
  • Object.wait(timeout)
  • Thread.join(timeout)
  • LockSupport.parkNanos(timeout)
  • LockSupport.parkUntil(timeout)

6. Terminated

一个线程正常执行完毕,或者意外失败,那么就结束了。

阻塞状态和等待状态的区别

  • 阻塞状态是等锁
  • 等待状态是等着被唤醒,或者等时间到

Smile3k
197 声望22 粉丝

引用和评论

0 条评论