zoukankan      html  css  js  c++  java
  • Java多线程开发系列之三:线程这一辈子(线程的生命周期)

           前文中已经提到了,关于多线程的基础知识和多线程的创建。但是如果想要很好的管理多线程,一定要对线程的生命周期有一个整体概念。本节即对线程的一生进行介绍,让大家对线程的各个时段的状态有一定了解。


    线程的一生的状态过程

    如下图:

             
    线程会由出生 到运行  再到 死亡。在前文中曾经讲到过(寻找前文请点这里):java中各个线程是抢占式的:cpu一般不会为一个线程从出生一直服务到老,各个线程总是争抢的希望得到cpu的“青睐”。当某个线程发生阻塞时,那么cpu就会被其他线程迅速抢占。而当前阻塞的线程只能变为就绪状态,等待cpu下次的“垂青”。这里有句老话挺符合的:机会总是留给有准备的人的(当前处于就绪状态的),如果你还没准备好(阻塞),机会就转瞬即逝了(转向其他线程了)。
    所以如上图所示:(防盗连接:本文首发自王若伊_恩赐解脱http://www.cnblogs.com/jilodream/ )
          线程在出生后(被new出来以后)即为新建状态,此时jvm会为其分配内存、初始化字段,仅此。然后进入就绪状态(执行Start方法)开始排队,紧接着当cpu开始执行(抢占到资源)该线程,线程进入运行状态,接着由于某种原因需要等待(如睡眠,等待需要调用的资源(如被其它资源占用,或者开启需要准备时间))而被迫进入阻塞状态。待等待结束后(睡眠时间到后、等待资源被释放)线程会再次进入就绪状态,等待着cpu的再次垂青。于此同时如果运行状态中的线程由于cpu调度的问题,而失去运行权利后也会被变为就绪状态,等待cpu的再次降临。当运行中的线程执行完线程体中的任务后、或者由于某种异常而挂起后,该线程就会进入死亡状态

    状态跳转详解:
    在上图中各个步骤(途中数字)代表的情况
    新建New---->就绪Runnable 运行Start()方法
    就绪Runnable---->运行Running 获得cpu资源
    运行Running---->阻塞Blocked

    进入睡眠、

    被挂起、

    等待其他资源、

    等待某个通知(后文会讲到)、

    等待某个IO资源

    阻塞Blocked---->就绪Runnable

    睡眠时间到、

    挂起后被重新恢复、

    等待资源已经被释放、

    获取到其他线程的通知(后文会讲到)、

    IO方法已经返回

    运行Running---->就绪Runnable

    处理器放弃当前线程,处理其他线程去了

    运行Running---->死亡Dead

     当前线程的执行体已经被运行结束、

    当前线程抛出了无法解决的异常或错误


    其它一些需要注意的地方:

    (1)线程启动后,并不会立刻运行,具体运行时间要看虚拟机的调度(前文中有讲)

    (2)线程一旦死亡就不能再重新启动就绪(使用Start方法),如果强制启动会抛出异常。

    (3)想判断当前的线程是否已经被启动并且还未死亡(就绪、运行、阻塞),可以使用isAlive()方法判断

    (4)启动线程进入就绪状态请务必使用Start()方法启动,而非Run方法,原因在创建多线程时也曾经讲过。

    (5)线程一旦启动,大家都是独立的处理,并不会因为父线程(创建并启动子线程的线程)出现某种状态,而影响到自身(如父线程死亡后,子线程仍然会继续运行)。

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/jilodream/p/4289316.html
Copyright © 2011-2022 走看看