Jakartase_多线程 --- 线程的5大状态(贰)

1、前言:

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

2、状态概述

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

3、状态详述

3.一、初始状态(New)

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

3.二、就绪状态(Runnable)

  • 描述java

    • 处于就绪状态的线程已经具有了运行条件,可是尚未被分配到CPU,处于“线程就绪队列”,等待系统为其分配cpu。
    • 就绪状态并非执行状态,当系统选定一个等待执行的Thread对象后,它就会进入执行状态。安全

      • 一旦得到cpu,线程就进入运行状态并自动调用本身的run()方法
  • 条件多线程

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

3.三、运行状态(Running)

  • 描述 :处于运行状态的线程最为复杂。线程

    • 就绪状态的线程在得到CPU时间片后变为运行状态(running)
    • 获得cpu的调度后,在运行状态的线程执行本身run()方法中的代码,直到调用其余方法而终止或等待某资源而阻塞或完成任务而死亡
    • 若是在给定的时间片内没有执行完毕 / 该线程失去了cpu资源,就会又从运行状态变为就绪状态。
    • 没有执行完毕被换下后,也可能因为某些“致使阻塞的事件”而进入阻塞状态。
  • 线程从运行状态变为阻塞状态的条件code

    • ①、线程调用sleep()方法主动放弃所占用的系统资源
    • ②、线程调用一个阻塞式IO方法,在该方法返回以前,该线程被阻塞
    • ③、线程试图得到一个同步监视器,但更改同步监视器正被其余线程所持有
    • ④、线程在等待某个通知(notify()
    • ⑤、程序调用了线程的suspend()方法将线程挂起对象

      • 注:suspend()容易致使死锁,程序应该尽可能避免使用该方法
  • 线程从运行状态变为死亡状态的条件生命周期

    • ①、当线程的run()方法执行完,
    • ②、线程被强制性地终止,例如出现异常
    • ③、调用了stop()、desyory()

3.四、阻塞状态 (Blocked)

  • 描述队列

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

    1. 执行sleep(int millsecond)方法,使当前线程休眠,进入阻塞状态。
         当指定的时间到了后,线程进入就绪状态。
      2. 执行wait()方法,使当前线程进入阻塞状态。当使用nofity()方法唤醒这个线程后, 
         它进入就绪状态。
      3. 线程运行时,某操做会阻塞,eg:执行IO流操做(read()/write()方法自己就是阻塞的方法)。
         只有当引发该操做阻塞的缘由消失后,线程进入就绪状态。
      4. join()线程联合: 当某个线程等待另外一个线程执行结束后,才能继续执行时,
         使用join()方法。
    • 内存

      sleep()方法,线程是抱着资源睡觉(不释放资源)。
  • 分类

    - **等待阻塞:**运行状态的线程执行 `wait()`方法,使线程进入到**等待阻塞**状态。
    - **同步阻塞:**线程在获取 `synchronized` 同步锁**失败**(由于同步锁被其余线程占用)。
    - **其余阻塞:**
      - 经过调用线程的 `sleep()` 或 `join()` 发出了 `I/O` 请求时,线程就会进入到阻塞状态。
      - 当`sleep()` 状态超时,`join()` 等待线程终止或超时,或者 `I/O` 处理完毕,线程从新转入就绪状态。

3.五、死亡状态 (Terminated)

  • 描述

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

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

4、续...

相关文章
相关标签/搜索