专栏首页技术碎碎念Java线程的几种状态

Java线程的几种状态

java.lang.Thread.State中定义的集中Java线程的状态:

 1 /** 
 2  * A thread state.  A thread can be in one of the following states: 
 3  * <ul> 
 4  * <li>{@link #NEW}<br> 
 5  *     A thread that has not yet started is in this state. 
 6  *     </li> 
 7  * <li>{@link #RUNNABLE}<br> 
 8  *     A thread executing in the Java virtual machine is in this state. 
 9  *     </li> 
10  * <li>{@link #BLOCKED}<br> 
11  *     A thread that is blocked waiting for a monitor lock 
12  *     is in this state. 
13  *     </li> 
14  * <li>{@link #WAITING}<br> 
15  *     A thread that is waiting indefinitely for another thread to 
16  *     perform a particular action is in this state. 
17  *     </li> 
18  * <li>{@link #TIMED_WAITING}<br> 
19  *     A thread that is waiting for another thread to perform an action 
20  *     for up to a specified waiting time is in this state. 
21  *     </li> 
22  * <li>{@link #TERMINATED}<br> 
23  *     A thread that has exited is in this state. 
24  *     </li> 
25  * </ul> 
26  * 
27  * <p> 
28  * A thread can be in only one state at a given point in time. 
29  * These states are virtual machine states which do not reflect 
30  * any operating system thread states. 
31  * 
32  * @since   1.5 
33  * @see #getState 
34  */  
35 public enum State {  
36     /** 
37      * 没有start()的线程状态 
38      */  
39     NEW,  
40    
41     /** 
42      * 可运行线程的线程状态。处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统(如处理器)的其他资源 
43      */  
44     RUNNABLE,  
45    
46     /** 
47      * 线程处于阻塞状态。在进入或者重新进入synchronized代码块/方法时,等待monitor lock的一种状态 
48      */  
49     BLOCKED,  
50    
51     /** 
52      * 线程处于等待状态。,由于调用以下方法之一,线程会处于等待状态: 
53      *    Object.wait()  没有超时时间 
54      *    Thread.join()  没有超时时间 
55      *    LockSupport.park() 
56      */  
57     WAITING,  
58    
59     /** 
60      * 具有指定等待时间的等待状态。调用以下方法之一,在指定的等待时间内,使线程处于等待状态: 
61      *   Thread.sleep 
62      *   Object#wait(long)  有超时时间 
63      *   Thread.join(long)  有超时时间 
64      *   LockSupport.parkNanos 
65      *   LockSupport.parkUntil 
66      */  
67     TIMED_WAITING,  
68    
69     /** 
70      * 终止状态。 线程已完成执行 
71      */  
72     TERMINATED;  
73 }  

上述Java代码定义的几个状态中其实是没有running状态的。

线程的runnable状态是从虚拟机的角度来看的,表示这个线程正在运行。 但是处于Runnable状态的线程不一定真地消耗CPU. 处于Runnable的线程只能说明该线程没有阻塞在java的wait或者sleep方法上, 同时也没等待在锁上面。 但是如果该线程调用了本地方法, 而本地方法处于等待状态, 这个时候虚拟机是不知道本地代码中发生了什么, 此时尽管当前线程实际上也是阻塞的状态, 但实际上显示出来的还是runnable状态,这种情况下是不消耗CPU的。

阻塞与等待的区别:

阻塞:当一个线程试图获取对象锁(非java.util.concurrent库中的锁,即synchronized),而该锁被其他线程持有,则该线程进入阻塞状态。它的特点是使用简单,由JVM调度器来决定唤醒自己,而不需要由另一个线程来显式唤醒自己,不响应中断。

等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。它的特点是需要等待另一个线程显式地唤醒自己,实现灵活,语义更丰富,可响应中断。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。

参考文章:

线程状态

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ONOS集群选举分析

    首先简单介绍下自己,之前是做 floodlight 控制器开发的,鉴于 ODL 和 onos 的如火如荼的发展,如果不对了解点就感觉自己 OUT 了,因此忙里偷...

    SDNLAB
  • Java对象引用四个级别(强、软、弱、虚)

    最近,高级Java技术栈微信群中,有一些猿友在讨论JVM中对象的周期问题,有谈到引用的级别,现在为大家做个总结吧,虽然大多数公司并没有意识或者用到这些引用,但了...

    Java技术栈
  • 栈和队列就是这么简单

    一、前言 上一篇已经讲过了链表【Java实现单向链表】了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并...

    Java3y
  • Java内存泄漏介绍

    内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏...

    Java技术栈
  • Java父类强制转换子类原则

    最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗?...

    Java技术栈
  • JSON Web Token (JWT)生成Token及解密实战。

    昨天讲解了JWT的介绍、应用场景、优点及注意事项等,今天来个JWT具体的使用实践吧。 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用...

    Java技术栈
  • 史上最全Java多线程面试题及答案

    多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域。所以,学好多线程并发编程对Java程序员来来说极其重要的。 下面小编整理了60道最常见的Ja...

    Java技术栈
  • Java实现单向链表

    一、前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用~ 本...

    Java3y
  • 递归算法介绍及Java应用实战

    什么是递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程...

    Java技术栈
  • 为什么Netty这么火?与Mina相比有什么优势?

    Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工...

    Java技术栈

扫码关注云+社区

领取腾讯云代金券