乐趣区

Java多线程线程的5大状态

一、前言:

  • 一个线程对象在它的生命周期内,需要经历 5 个 状态。下面是对这 5 个状态的详述

二、状态概述

  • 初始状态(New)
  • 就绪状态(Runnable)
  • 运行状态(Running)
  • 阻塞状态(Blocked)
  • 死亡状态(Terminated)

三、状态详述

  • 3.1、初始状态(New)

    • 描述 :处于新生状态的线程有自己的内存空间,通过调用start() 方法进入 就绪状态
    • 条件 :用new 关键字建立一个线程对象后,该线程对象就处于新生状态。
  • 3.2、就绪状态(Runnable)

    • 描述

      • 处于就绪状态的线程已经具备了运行条件,但是还没有被分配到 CPU,处于“线程就绪队列”,等待系统为其分配 cpu。
      • 就绪状态并不是 执行状态 ,当系统选定一个等待执行的Thread 对象后,它就会进入执行状态。
      • 一旦获得 cpu,线程就进入运行状态并自动调用自己的 run() 方法
    • 条件

      1. 新建线程:调用 **start()** 方法,进入就绪状态;
      2. 阻塞线程:阻塞解除,进入就绪状态; 当前线程 sleep()方法结束,其他线程 join 结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。3. 运行线程:当前线程时间片用完了,调用 **yield()** 方法,直接进入就绪状态;
      4. 运行线程:JVM 将 CPU 资源从本线程切换到其他线程。
  • 3.3、运行状态(Running)

    • 描述

      • 就绪状态的线程在获得 CPU 时间片后变为 运行状态(running)
      • 在运行状态的线程执行自己 run() 方法中的代码,直到调用其他方法而终止或等待某资源而阻塞或完成任务而死亡
      • 如果在给定的时间片内没有执行完毕,就会被系统给换下来回到就绪状态
      • 没有执行完毕被换下后,也可能由于某些“导致阻塞的事件”而进入阻塞状态。
  • 3.4、阻塞状态(Blocked)

    • 描述

      • 阻塞指的是 暂停 一个线程的执行以等待某个条件发生(如某资源就绪)
      • 阻塞状态是线程阻塞在进入 synchronized 关键字修饰的方法或代码块 (获取锁) 时的状态
    • 条件

      1. 执行 sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。当指定的时间到了后,线程进入就绪状态。2. 执行 wait()方法,使当前线程进入阻塞状态。当使用 nofity()方法唤醒这个线程后,它进入就绪状态。3. 线程运行时,某操作会阻塞,eg: 执行 IO 流操作 (read()/write() 方法本身就是阻塞的方法)。只有当引起该操作阻塞的原因消失后,线程进入就绪状态。4. join()线程联合: 当某个线程等待另一个线程执行结束后,才能继续执行时,使用 join()方法。
    • sleep()方法,线程是抱着资源睡觉(不释放资源)。
  • 3.5、死亡状态(Terminated)

    • 描述

      • 死亡状态是线程生命周期中的最后一个阶段,不能复生。
      • 在一个终止的线程上调用 start()方法,会抛出 java.lang.IllegalThreadStateException异常
    • 原因

      1. 正常运行的线程完成了它 run()方法内的全部工作
      2. 线程被强制终止,如通过执行 stop()或 destroy()方法来终止一个线程。(注:stop()、destroy()方法已经被 JDK 废弃,不推荐使用,不安全)。3. 线程抛出未捕获的异常
      
      
      
      

四、下一篇 —> 线程控制的方法详述add(例子)

退出移动版