zoukankan      html  css  js  c++  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。

    参考文章:

    线程状态

  • 相关阅读:
    atitit.html编辑器的设计要点与框架选型 attilax总结
    test
    atitit.提取zip rar文件列表 java php c# 的原理与设计
    atitit.破解 拦截 绕过 网站 手机 短信 验证码 之自动获取手机短信方式 attilax 总结
    Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结
    SQL2008附加数据库提示错误:5120
    C++函数转换成C#函数
    Nhibernate cookbook 3.0-翻译
    黄聪:如何使用CodeSmith批量生成代码(转:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html)
    给JavaScript初学者的24条最佳实践(转:http://www.cnblogs.com/yanhaijing/p/3465237.html)
  • 原文地址:https://www.cnblogs.com/z941030/p/8610894.html
Copyright © 2011-2022 走看看