【并发编程】线程的状态

在 java.lang.Thread.State 中,总共定义了六种状态:

  1. NEW

    线程对象被创建,但是未启动,未调用 start 方法

  2. RUNNABLE

    RUNNABLE 这个状态只是表示线程是可运行的。

    就绪 ready 和运行中 running 两种状态笼统地称为 RUNNABLE。

  3. BLOCKED

    线程处于阻塞状态,正在等待一个监视器锁。

    通常情况下,是等待进入 synchronized 同步方法块或者方法,

    或者是处于 Object.wait 状态等待重新进入 synchronized 同步方法块或者方法

    一个线程调用 Object.wait 不带超时参数的方法,此时会进入 WAITING 状态,当另一个线程调用 Object.notify 或者 Object.notifyAll 方法后,在这个线程退出 synchronized 块之前,wait 的那个线程的状态由 WAITING 变为 BLOCKED

  4. WAITING

    等待状态,调用以下方法可能会导致一个线程处于等待状态:

    Object.wait 不带超时参数

    Thread.join 不带超时参数

    LockSupport.park

    一个线程处于等待状态,通常是等待另一个线程来唤醒。

    调用 Object.wait 的线程等待 Object.notify 或者 Object.notifyAll

    调用 Thread.join 的线程等待另一个线程执行完毕

  5. TIMED_WAITING

    线程等待指定的时间,对于以下方法的调用,可能会导致线程处于这个状态:

    Thread.sleep 带有超时参数

    Object.wait 带有超时参数

    Thread.join 带有超时参数

    LockSupport.parkNanos

    LockSupport.parkUntil

  6. TERMINATED

    线程终止

    这些状态中 NEW 状态是开始,TERMINATED 时销毁,在整个线程对象的运行过程中,这个两个状态只能出现一次。其他任何状态都可以出现多次,彼此之间可以相互转换。

经常有人把线程的状态又称为线程的生命周期。个人认为这种叫法并不好,因为生命周期通常指的是一个对象从创建到销毁所必须要经历的过程。

例如 J2EE 的 Servlet 的生命周期方法是 init->service->destroy,这三个阶段是必须要经历的。

对于线程而言,完全可以 NEW 了之后就直接到 TERMINATED 了,或者只经历其中某些状态而不是所有。

总之,需要知道的一点是,别人和你提到线程状态或者是线程生命周期,其实指的是同一个东西。


网上有很多人说是五种,五种其实是跟据操作系统层面来划分的。

分别是新建、就绪、运行中、阻塞、死亡

新建状态,刚创建出线程

就绪,没有获得 CPU 时间片

运行中,获得 CPU 时间片,正在执行

阻塞,IO 阻塞、Object.wait 对操作系统来说都属于阻塞

死亡,线程执行完毕后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值