多线程系列(一)—— 线程的状态及转换

导读:本篇文章讲解 多线程系列(一)—— 线程的状态及转换,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、简介

  •  本文主要介绍线程的六大状态及其转换;
  •  操作系统中线程的状态如下:  NEW, READY,RUNNING, BLOCKED(包含了JAVA中的BLOCKED, WAITING,TIMED_WAITING), DIED;
  •  java中线程的状态如下:  java.lang.Thread类中有一个关于状态的枚举State,里面注明了 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED六大状态。

 

二、线程状态

2.1 JDK中线程状态

public class Thread {
    ...
    public enum State {
        /**
         * 尚未启动的线程的线程状态
         */
        NEW,

        /**
         * 可运行线程的线程状态。
         * 可运行状态中的线程在Java虚拟机中执行,
         * 但它可能等待来自操作系统(如处理器)的其他资源。
         */
        RUNNABLE,

        /**
         * 线程的线程状态被阻止,正在等待监视器锁。
         * 处于阻塞状态的线程正在等待监视器锁进入同步块/方法,
         * 或在调用object.wait后重新输入同步块/方法。
         */
        BLOCKED,

        /**
         * 等待线程的线程状态。由于调用以下方法之一,线程处于等待状态:
         * Object.wait with no timeout
         * Thread.join with no timeout
         * LockSupport.park
         * 
         *
         * 处于等待状态的线程正在等待另一个线程执行特定操作。
         * 例如,在一个对象上调用了object.wait()的线程正在等待另一个线程在该对象上调用
         * object.notify()或object.notifyAll()。
         * 调用了thread.join()的线程正在等待指定的线程终止。
         */
        WAITING,

        /**
         * 具有指定等待时间的等待线程的线程状态。
         * 由于使用指定的正等待时间调用以下方法之一,线程处于正等待状态:
         * Thread.sleep
         * Object.wait with timeout
         * Thread.join with timeout
         * LockSupport.parkNanos
         * LockSupport.parkUntil
         */
        TIMED_WAITING,

        /**
         * 终止线程的线程状态。线程已完成执行。
         */
        TERMINATED;
    }
    ...
}

2.2  线程状态转换图

多线程系列(一)------ 线程的状态及转换

 

2.3 状态详解

2.3.1 初始状态NEW

  • 线程被new出来的时候就是初始状态

2.3.2 运行状态RUNNABLE

  • 运行状态可以细分为就绪状态和运行中状态。当调用Thread.start()方法后就会进入就绪状态,然后等待系统调度,就会进入到运行中状态。运行中状态可以通过Thread.yield()方法让出CPU执行权,重新进入到就绪状态。

2.3.3 阻塞状态BLOCKED

  • 当线程在进入synchronized关键字修饰的方法或代码块(获取锁)时会被阻塞。

2.3.4 等待状态WAITING

  • 处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

2.3.5 超时等待TIMED_WAITING

  • 处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。

2.3.6 终止状态TERMINATED

  • 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
  • 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

 

三、多线程系列链接

  1. 多线程系列(一)—— 线程的状态及转换
  2. 多线程系列(二)—— 线程的创建方式
  3. 多线程系列(三)—— 线程常用方法
  4. 多线程系列(四)—— 线程优先级和守护线程和终止线程的方式
  5. 多线程系列(五)—— 死锁案例以及检测方法

  6. 多线程系列(六)—— 生产者消费者案例

  7. 多线程系列(七)—— synchronized关键字简单使用以及可重入性 
  8. 多线程系列(八)—— synchronized关键字原理以及锁优化
  9. 多线程系列(九)—— volatile相关TODO
  10. ThreadLocal相关
  11. 锁LOCK相关系列
  12. 原子类相关系列
  13. 并发集合相关系列
  14. 线程池相关系列

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17752.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!