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


线程的一生的状态过程

如下图:

         
线程会由出生 到运行  再到 死亡。在前文中曾经讲到过(寻找前文请点这里):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)线程一旦启动,大家都是独立的处理,并不会因为父线程(创建并启动子线程的线程)出现某种状态,而影响到自身(如父线程死亡后,子线程仍然会继续运行)。

Java多线程开发系列之三:线程这一辈子(线程的生命周期)的更多相关文章

  1. Java多线程开发系列之番外篇:事件派发线程---EventDispatchThread

    事件派发线程是java Swing开发中重要的知识点,在安卓app开发中,也是非常重要的一点.今天我们在多线程开发中,穿插进来这个线程.分别从线程的来由.原理和使用方法三个方面来学习事件派发线程. 一 ...

  2. Java多线程开发系列之一:走进多线程

    对编程语言的基础知识:分支.选择.循环.面向对象等基本概念理解后,我们需要对java高级编程有一定的学习,这里不可避免的要接触到多线程开发. 由于多线程开发整体的系统比较大,我会写一个系列的文章总结介 ...

  3. Java多线程开发系列之四:玩转多线程(线程的控制2)

    在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...

  4. Java多线程开发系列之四:玩转多线程(线程的控制1)

    在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...

  5. Java多线程开发系列之二:如何创建多线程

    前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有 ...

  6. Java多线程开发系列之五:Springboot 中异步请求方法的使用

    Springboot 中异步线程的使用在过往的后台开发中,我们往往使用java自带的线程或线程池,来进行异步的调用.这对于效果来说没什么,甚至可以让开发人员对底层的状况更清晰,但是对于代码的易读性和可 ...

  7. [转]Java多线程干货系列—(一)Java多线程基础

    Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...

  8. Java多线程开发技巧

    很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读<Java并发编程实践&g ...

  9. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. substr 与 substring 的区别

    substr (start[, 所要子川的长度]); substring(start, 结束的位置)

  2. Python笔记-第一天

    1.Python的输出print函数要把输出的字符串用单引号或者双引号括起来,但是不能混用. 比如print('hello,world')和print("hello,world") ...

  3. osg中内嵌QtBrowser

    最近看到osg Examples的osgQtBrowser例子, 觉得效果还是挺好的, 想加入到自己的项目中来, 就这样的搬运工作也出问题了-__- 拷过来的是这一段: osg::ref_ptr< ...

  4. 【新手学Python】一、基础篇

    由于以前处理数据用Matlab和C,最近要处理大量文本文件,用C写实在是太繁琐,鉴于Python的强大文本处理能力,以及其在Deep Learning上有着很大优势,本人打算从即日起学习Python, ...

  5. 阿里云SLB双机IIS多站点负载均衡部署笔记

    首先SLB是通过局域网与ECS链接 ECS1服务器 test文件夹增加index.html test1文件夹增加index.html 设置ECS1服务器(130)IIS test站点 设置test主机 ...

  6. PHP编程效率的20个要点

    用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数” 用 单引号代替双引 ...

  7. 解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法

    方式一:Coding JavaScript <!--[if lt IE9]> <script> (function() { var e = "abbr, articl ...

  8. Android课程---添加黑名单的练习2(课堂讲解)

    实现黑名单的添加.修改.查询和删除,首先得有封装的3个类,便于使用 BlackNumber.java package com.hanqi.test3; /** * Created by Adminis ...

  9. Neil·Zou 语录二

    1 “Later equals never !”LeBlanc法则   2 爱情使人忘记时间,时间也会使人忘记爱情,不要让太多的昨天占据你的今天,请相信:是你的不管你怎样任性他都不会离开你:失去的其实 ...

  10. JS学习总结(新手)

    1. JS面向对象 http://www.cnblogs.com/JavascriptDream/p/5064976.html a. Prototype 属性的理解 b. 遗传继承函数 functio ...