文档章节

并发编程基础二--线程的生命周期

Credo-Zhao
 Credo-Zhao
发布于 2013/02/06 12:10
字数 807
阅读 202
收藏 3

行业解决方案、产品招募中!想赚钱就来传!>>>

对于线程来说,它既不是一启动就进入执行状态,也不是一直处于执行状态.它的生命周期总体为:

  1. 新建(New)
  2. 准备就绪(Runnable)
  3. 运行(running)
  4. 阻塞或说等待(Blocked)
  5. 死亡(Dead)

线程有五种状态,当线程启动,开始运行后,它也不会一直处于运行状态,而是会在就绪,运行,阻塞之间来回切换.

1,2阶段 新建,准备:

一般情况下着两个在代码里总是写一起的.如下code:

//继承Thread的
new FirstThread().start();
//实现runnable的
new Thread(fr,"newThread11").start();
//实现callable的
new Thread(future, "有返回值的线程").start();
//具体代码参照以前的文章,有的.
可以看到,但new XXXThread的时候属于新建,而用start的时候就属于准备就绪,runnable状态.

即使是start也不一定就立即开始执行,如果希望调用子线程的start()方法后立即执行,那么就让主线程沉睡下,Thread.sleep(1).1毫秒就够了,但是如果存在多个子线程,就不好控制了.一般也没必要控制这个.

3.4阶段 运行和阻塞

在线程开始运行后,除非线程执行体足够短,才能直接结束,否则一般情况下都是运行一会,阻塞一会,再运行~~~直到完成.具体机制在于JVM的调度策略.

只有当一个线程调用了它的sleep()和yield()才会放弃所占用的资源--也就是说必须由该线程主动放弃所占用资源.

但发生如下情况.线程会进入阻塞状态:

  • 1.线程调用sleep方法,主动放弃处理器资源.(到达规定时间,进入就绪状态)
  • 2.调用了一个阻塞式的IO方法,在方法返回前,该线程被阻塞.(返回了..进入就绪)
  • 3.线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有.(获得了同步监视器.)
  • 4.线程在等待某个通知,notify.(得到通知了)
  • 5.程序调用了线程的suspend()方法将线程挂起,但API说这货容易死锁,所以大家不要用.(用resume恢复)

大家需要注意的就是,线程从~~~阻塞-->就绪-->运行-->阻塞-->就绪-->运行~~~,并不是从阻塞直接到运行的.而是阻塞后再次进入就绪状态...

就是这样在3个状态轮回的,但又个例外就是:

yield()方法可以让运行状态的线程直接进入就绪状态.

5.线程死亡

1.run()或call()方法执行完成,线程正常结束.
2.线程抛出一个没有捕获的异常或者错误.
3.直接调用了stop方法来结束线程.(容易死锁,通常不用.)

判断线程是否死亡用isAlive()方法,在就绪,运行,阻塞阶段,返回true.其他新建,死亡阶段为flase.

  • 对新建的线程调用2次start方法,是错误的.
  • 对死亡的线程调用start方法也是错误的.
  • 这2个都会引发 I11egakThreadStateException异常.
Credo-Zhao

Credo-Zhao

粉丝 311
博文 173
码字总数 247984
作品 0
朝阳
技术主管
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
3.9K
3
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.2K
16
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
6
WSGI Web服务器--UV-Web

uv-web是一个轻量级的支持高并发的WSGI Web服务器,基于libuv构建,部分代码源于开源项目bjoern,本质是python的C扩展,所以适用于部署绝大部分 python web应用(如 Django) 特性 兼容 HTTP 1...

Jone.x
2013/03/04
1.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 上传文件

package com.taven.demo;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframewor......

tavenpy
25分钟前
4
0
GitHub 标星 44k!史上最全技术面试手册!

整理:迷妹 大家好,我是为前端娱乐圈操碎了心的小迷妹,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标。 每...

祈澈菇凉
今天
0
0
Sublime Text3配置及控制台乱码[cmd杀死进程乱码/编译文件乱码]解决方法

Sublime Text3配置及控制台乱码[cmd杀死进程乱码/编译文件乱码]解决方法 参考文章: (1)Sublime Text3配置及控制台乱码[cmd杀死进程乱码/编译文件乱码]解决方法 (2)https://www.cnblogs...

osc_wl6d9wri
26分钟前
0
0
JS实现网页轮播(每隔5秒切换)

function onload() { <%=sb_js_onload.ToString() %> var timer = setInterval("jump_url()", 1000); } var arrurl = ["screen.aspx?code......

_Somuns
26分钟前
7
0
程序猿:论学习方式的重要性

大家都知道,做我们开发这行的,最核心的竞争力就是学习能力。技术一直在变化,框架一直在更新,学还是不学。 不学,你会落伍,学,太累了,根本学不过来。学习只要找对了方法,也没那么累。...

osc_zg8wy3xa
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部