java 线程状态

概述

    public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
    }

State为java线程状态的枚举类,定义在Thread中。
java的线程状态是jvm自己定义的,跟操作系统中的线程(或者说原生线程库,比如linux中的pthread)状态没有直接联系,不能相互对应。

各状态说明

NEW

Thread t = new Thread(runable);
当使用new操作符创建线程时,就处于这个状态。此时只是创建了一个线程对象(java中的普通对象),并未调用系统去真正的创建一个系统级的线程。因此用命令行工具(pstree等)查询不到。

RUNNABLE

当调用start方法后(未阻塞在同步代码上),线程就会处于这个状态。
java的线程不存在RUNNING状态,只要线程没有阻塞在同步代码上,线程就是处于RUNNABLE状态,即使线程被操作系统调度出去。

BLOCKED

当线程等待锁时,就处于这个状态。
当线程阻塞在synchronized代码块时就处于这个状态。

WAITING

jdk部分API实现了等待队列,比如Object.wait,Thread.join,LockSupport.park。当线程调用这些函数时,如果条件不满足,线程就会进入等待队列。此时线程就会处于这个状态。

TIMED_WAITING

当线程进入等待队列时,设置了超时时间,就会处于这种状态。比如:

  • Thread.sleep
  • Object.wait(long)
  • thread.join(long)
  • LockSupport.parkNanos
  • LockSupport.parkUntil

TERMINATED

线程已结束

分析

BLOCKED与WAITING的区别

从虚拟机的角度来说,BLOCKED只是阻塞在竞争锁的代码上了,线程本身是可以随时被调度的,只不过在次被调度时,发现仍然没有获取到锁,又会被调度器切出去。
WAITING状态表示,线程因为等待的某个事件的条件未达成,进入了该事件的等待队列,被剥夺了调度执行的机会。只有其等待的事件条件达成了,其才能被移除等待队列,在进入可调度队列。
说明:上述描述可能不严谨,想要表达的意思是,WAITING相对于BLOCKED来说,WAITING状态的线程被虚拟机放入等待队列了,只有事件条件达成后,触发JVM将线程移除队列,得到被调度的机会,即使被移除队列后,线程也可能被阻塞在同步代码上。

线程状态为什么这么设计

java程序运行在虚拟机中,synchronized,Object.wait,thread.join等功能是虚拟机自己设计的,且虚拟机能够进行干预,所以虚拟机根据这些功能对线程状态进行了归类。

  1. 比如虚拟机调用LockSupport.park后,能够调用LockSupport.unpark让线程解除等待。
  2. 比如虚拟机是解释型语言,当进入synchronized同步块时,如果竞争锁失败,JVM有机会去设置线程状态。

系统原生的线程状态,比如调用read函数后阻塞了。第一,JVM无法干预,因为这个属于系统功能,不受JVM控制;第二,调用read函数阻塞后,线程就被操作系统调度出去了,线程自己没有时机去设置线程状态,所以JVM无法利用线程的原生状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值