欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 线程状态概述

程序员文章站 2022-04-15 18:32:14
概述 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }State为java线程状态的枚举类,定义在Thread中。java的线程状态是jvm自己定义的,跟操作系统中的线程(或者说原生线程库,比如linux中的pthread)状态没有直接联系,不能相互对应。各状态说明NEWT...

概述

    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无法利用线程的原生状态。

本文地址:https://blog.csdn.net/shuxiaohua/article/details/110221838

相关标签: java