zoukankan      html  css  js  c++  java
  • 线程的生命周期

    线程的生命周期中有5个状态:创建、就绪、运行、阻塞、死亡。其中从就绪到运行,这两个状态的切换存在不确定因素,需要等待cpu的调度,获取cpu的时间片。

    1:新建和就绪状态
        当程序使用new关键字创建了一个线程之后,该程序处于创建状态。
        当线程调用start()方法之后,该线程处于就绪状态。

    注意:启动线程的方法是start()并不是run()方法。永远不要让线程对象直接调用run()方法。

    2:运行和阻塞
        运行和阻塞这两个状态是线程中最“复杂”的状态,不过,运行只能单向的到阻塞,而阻塞并不能直接到运行状态。

    从运行到阻塞的情况:
        (1)线程调用sleep()方法
        (2)线程调用了一个阻塞IO方法,在方法返回前,线程被阻塞。
        (3)线程获取一个同步监视器,可是该监视器正在被其他线程使用。
        (4)线程等待某个通知(notify)
        (5)线程调用了suspend()方法,将该线程挂起。(不建议使用,会造成死锁)

    阻塞状态只能重新到达就绪状态:    
        (1)调用sleep()方法的线程经过了指定时间。
        (2)调用的阻塞IO方法已经返回。
        (3)线程已经获取到了同步监视器。
        (4)线程等到了其它线程的通知。
        (5)线程调用resume()方法将挂起的线程恢复。

    线程切换图:    
    3:线程死亡

    线程从运行到死亡的方式:
        (1)调用线程的stop()方法。(不建议使用,容易造成死锁)
        (2)线程抛出一个未捕获的Exception或Error
        (3)线程执行体run()或call()方法执行结束。

    注意: 线程中有一个很常见的异常:IllegalStateException(非法状态异常)。用通俗的语言表达就是,在线程相应的状态干了不相应的事。   
    比如说:
        同一个线程调用了两次start()方法。线程调用第一次start()方法就已经处于就绪状态了,再次以就绪状态调用start()方法让自身处于就绪状态,请问这是闹哪样?
    再比如说:
        已经死亡的线程,调用start()方法。都“死亡”了,线程自己就没点“逼数”吗?

  • 相关阅读:
    leetcode 17 Letter Combinations of a Phone Number
    剑指offer 数字翻译成字符串
    剑指offer 把数组排成最小的数
    剑指offer 整数中1出现的次数(从1到n整数中1出现的次数)
    剑指offer 数据流中的中位数
    RNN, LSTM, GRU cells
    剑指offer 最小的K个数
    PWA-网络
    PWA-缓存
    2018 总结
  • 原文地址:https://www.cnblogs.com/xm970829/p/12981022.html
Copyright © 2011-2022 走看看