zoukankan      html  css  js  c++  java
  • 线程的状态

    在Thread类中有一个 整数型 变量 threadStatus ,标示了该线程的状态,它是一个int类型,但是对应的get方法返回值是一个枚举State,源码如下:

    public enum State {
    /**
    * Thread state for a thread which has not yet started.
    */
    NEW,

    /**
    * Thread state for a runnable thread. A thread in the runnable
    * state is executing in the Java virtual machine but it may
    * be waiting for other resources from the operating system
    * such as processor.
    */
    RUNNABLE,

    /**
    * Thread state for a thread blocked waiting for a monitor lock.
    * A thread in the blocked state is waiting for a monitor lock
    * to enter a synchronized block/method or
    * reenter a synchronized block/method after calling
    * {@link Object#wait() Object.wait}.
    */
    BLOCKED,

    /**
    * Thread state for a waiting thread.
    * A thread is in the waiting state due to calling one of the
    * following methods:
    * <ul>
    * <li>{@link Object#wait() Object.wait} with no timeout</li>
    * <li>{@link #join() Thread.join} with no timeout</li>
    * <li>{@link LockSupport#park() LockSupport.park}</li>
    * </ul>
    *
    * <p>A thread in the waiting state is waiting for another thread to
    * perform a particular action.
    *
    * For example, a thread that has called <tt>Object.wait()</tt>
    * on an object is waiting for another thread to call
    * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
    * that object. A thread that has called <tt>Thread.join()</tt>
    * is waiting for a specified thread to terminate.
    */
    WAITING,

    /**
    * Thread state for a waiting thread with a specified waiting time.
    * A thread is in the timed waiting state due to calling one of
    * the following methods with a specified positive waiting time:
    * <ul>
    * <li>{@link #sleep Thread.sleep}</li>
    * <li>{@link Object#wait(long) Object.wait} with timeout</li>
    * <li>{@link #join(long) Thread.join} with timeout</li>
    * <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
    * <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
    * </ul>
    */
    TIMED_WAITING,

    /**
    * Thread state for a terminated thread.
    * The thread has completed execution.
    */
    TERMINATED;
    }

    1、新建状态(new)        

    新创建了一个线程对象(实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来),但还没有调用start()方法。至今尚未启动的线程处于这种状态.

    2、就绪状态(Runnable)  

    正在 Java 虚拟机中执行的线程处于这种状态。RUNNABLE状态包括了操作系统线程状态中的Running和Ready,即线程可能正在运行,也可能正在等待其他资源或操作系统的处理,一旦获取到CPU资源进行了执行,则进入RUNNING状态。

    1. 调用线程的start()方法,此线程进入就绪状态。
    2. 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
    3. 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
    4. 锁池里的线程拿到对象锁后,进入就绪状态

    3、阻塞状态(Blocked)

    受阻塞并等待某个监视器锁的线程处于这种状态。阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。BLOCKED状态的线程会一直等待监视器锁,而后执行synchronized代码块/方法。或者在调用Object.wait()后,执行synchronized代码块/方法。

    进入阻塞状态的原因有:①通过调用sleep(millseconds)使任务进入休眠状态;②通过调用wait()使线程挂起,直到线程获取notify()/notifyAll()消息,(或者在Java SE5中java.util.concurrent类库中等价的signal()/signalAll()消息),线程才会进入就绪状态;③任务在等待某个输入 / 输出流的完成;④任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取了该锁;

    4、无限期地等待(WAITING)

    无限期地等待另一个线程来执行某一特定操作的线程处于这种状态 。处于这种状态的线程不会被分配CPU执行时间,它们要等待显示的被其它线程唤醒。这种状态通常是指一个线程拥有对象锁后进入到相应的代码区域后,调用相应的“锁对象”的wait()方法操作后产生的一种结果。变相的实现还有LockSupport.park()、Thread.join()等,它们也是在等待另一个事件的发生,也就是描述了等待的意思

    以下方法会让线程陷入无限期等待状态:

    (1)没有设置timeout参数的Object.wait()

    (2)没有设置timeout参数的Thread.join()

    (3)LockSupport.park()

    “阻塞”与“等待”的区别:

    (1)“阻塞”状态是等待着获取到一个排他锁,进入“阻塞”状态都是被动的,离开“阻塞”状态是因为其它线程释放了锁,不阻塞了;

    (2)“等待”状态是在等待一段时间 或者 唤醒动作的发生,进入“等待”状态是主动的

    如主动调用Object.wait(),如无法获取到ReentraantLock,主动调用LockSupport.park(),如主线程主动调用 subThread.join(),让主线程等待子线程执行完毕再执行

    离开“等待”状态是因为其它线程发生了唤醒动作或者到达了等待时间

    5 限期等待(TIMED_WAITING )

    处于这种状态的线程也不会被分配CPU执行时间,不过无需等待被其它线程显示的唤醒,在一定时间之后它们会由系统自动的唤醒。

    通过以下方法进入TIMED_WAITING状态:

    1. 调用Thread.sleep()
    2. 调用Object.wait()超过时间阈值
    3. 调用Thread.join()超过时间阈值
    4. 调用LockSupport.parkNanos(Object,long)
    5. 调用LockSupport.parkUntil(Object,long)

    6 TERMINATED 

      已退出的线程处于这种状态即线程执行完成就会变为这个状态

    1. 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
    2. 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
  • 相关阅读:
    窗体1打开窗体2的方法
    C#中窗体间传递数据的几种方法(转载)
    只读字段和常量
    Datepicker控件
    .NET中的加密和解密
    ASP.NET网页生命周期事件
    hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)
    我的第一次博客
    弹性布局
    HTML标签部分(块级/行级)
  • 原文地址:https://www.cnblogs.com/zjf6666/p/9360008.html
Copyright © 2011-2022 走看看