zoukankan      html  css  js  c++  java
  • 线程包括哪些状态?状态之间是如何转变的?

    线程的生命周期

    线程包括哪些状态的问题说专业一点就是线程的生命周期。
    不同的编程语言对线程的生命周期封装是不同的。

    Java 中线程的生命周期

    Java 语言中线程共有六种状态。

    1. NEW(初始化状态)
    2. RUNNABLE(可运行 / 运行状态)
    3. BLOCKED(阻塞状态)
    4. WAITING(无限时等待)
    5. TIMED_WAITING(有限时等待)
    6. TERMINATED(终止状态) 在操作系统层面,Java 线程中的 BLOCKED、WAITING、TIMED_WAITING 是一种状态(休眠状态)。即只要 Java 线程处于这三种状态之一,就永远没有 CPU 的使用权。

    如图: 

    Java 中线程的状态的转变

    1. NEW 到 RUNNABLE 状态

    Java 刚创建出来的 Thread 对象就是 NEW 状态,不会被操作系统调度执行。从 NEW 状态转变到 RUNNABLE 状态调用线程对象的 start() 方法就可以了。

    2. RUNNABLE 与 BLOCKED 的状态转变

    • synchronized 修饰的方法、代码块同一时刻只允许一个线程执行,其他线程只能等待,等待的线程会从 RUNNABLE 转变到 BLOCKED 状态。
    • 当等待的线程获得 synchronized 隐式锁时,就又会从 BLOCKED 转变到 RUNNABLE 状态。
      在操作系统层面,线程是会转变到休眠状态的,但是在 JVM 层面,Java 线程的状态不会发生变化,即 Java 线程的状态会保持 RUNNABLE 状态。JVM 层面并不关心操作系统调度相关的状态,因为在 JVM 看来,等待 CPU 使用权(操作系统层面处于可执行状态)与等待 I/O(操作系统层面处于休眠状态)没有区别,都是在等待某个资源,都归入了 RUNNABLE 状态。
      Java 在调用阻塞式 API 时,线程会阻塞,指的是操作系统线程的状态,并不是 Java 线程的状态。

    3. RUNNABLE 与 WAITING 的状态转变

    • 获得 synchronized 隐式锁的线程,调用无参数的 Object.wait() 方法,状态会从 RUNNABLE 转变到 WAITING;调用 Object.notify()、Object.notifyAll() 方法,线程可能从 WAITING 转变到 RUNNABLE 状态。
    • 调用无参数的 Thread.join() 方法。join() 是一种线程同步方法,如有一线程对象 Thread t,当调用 t.join() 的时候,执行代码的线程的状态会从 RUNNABLE 转变到 WAITING,等待 thread t 执行完。当线程 t 执行完,等待它的线程会从 WAITING 状态转变到 RUNNABLE 状态。
    • 调用 LockSupport.park() 方法,线程的状态会从 RUNNABLE 转变到 WAITING;调用 LockSupport.unpark(Thread thread) 可唤醒目标线程,目标线程的状态又会从 WAITING 转变为 RUNNABLE 状态。

    4. RUNNABLE 与 TIMED_WAITING 的状态转变

    • Thread.sleep(long millis)
    • Object.wait(long timeout)
    • Thread.join(long millis)
    • LockSupport.parkNanos(Object blocker, long deadline)
    • LockSupport.parkUntil(long deadline)
      TIMED_WAITING 和 WAITING 状态的区别,仅仅是调用的是超时参数的方法。

    5. RUNNABLE 到 TERMINATED 状态

    • 线程执行完 run() 方法后,会自动转变到 TERMINATED 状态
    • 执行 run() 方法时异常抛出,也会导致线程终止
    • Thread类的 stop() 方法已经不建议使用

     

     来一道刷了进BAT的面试题?

  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/11686193.html
Copyright © 2011-2022 走看看