文档章节

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

Zhao-Qian
 Zhao-Qian
发布于 2013/02/06 12:10
字数 807
阅读 195
收藏 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异常.

© 著作权归作者所有

共有 人打赏支持
Zhao-Qian
粉丝 311
博文 158
码字总数 238167
作品 0
朝阳
技术主管
Nova 中的协程 -- 同步 (二)

图片来源请见 Nova 版本:Icehouse Eventlet 版本:0.18.2 Overview 同步是一个与并发相随的永恒话题,也是编程的一个难题。对 race condition 处理不当,轻者影响性能,重则死锁。协程被称为...

koala bear
2014/09/26
0
0
转载--大神的“思想”

1、基本概念 什么是进程: 进程是在系统运行的一个程序,每个进程之间是独立的,每个进程均运行在其专有且受保护的内存空间内。 什么是线程: 一个进程想要执行任务,必须得有线程(至少一个...

细雨微风轻诉流年
2016/09/06
19
0
Java系列文章(全)

JVM JVM系列:类装载器的体系结构 JVM系列:Class文件检验器 JVM系列:安全管理器 JVM系列:策略文件 Java垃圾回收机制 深入剖析Classloader(一)--类的主动使用与被动使用 深入剖析Classloader(二...

www19
2017/07/04
0
0
并发编程(一):多线程基础知识

两种创建线程方法 继承类: 1. 继承Thread 类; 实现接口: 2. 实现Rnnable接口; 3. 实现Callable接口(rnnable的增强版,可以有返回值和抛异常) 对比: Rnnable、Callable接口: 编程复杂...

mengdonghui123456
2017/08/15
0
0
python高性能编程--001--线程与进程的基本概念

一、什么是进程 进程是程序的一次执行,而程序即为磁盘中可执行的二进制等类型的数据。 进程的生命周期:程序被读取到内存中,被操作系统调用时才开始它的生命周期。 每个进程都有自己的地址...

王新睿
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash常用内置变量介绍

Bash常用内置变量介绍 Bash中有很多内置变量,这些变量不仅影响Bash的相关行为,也大大的方便了用户的常见操作。**Bash内置变量大体上包括两类,一类是传统Shell所具备的,另一类就是Bash所特...

小陶小陶
36分钟前
1
0
05-《深度拆解Java虚拟机》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
56分钟前
3
0
nginx统一入口 多服务出口

nginx配置多ip和端口统一调用入口log_format中$upstream_addr 标识打印转发的url地址配置upstream和locationhttp {include mime.types;default_type application/octet-stream...

GoldenVein
58分钟前
3
0
阿里P9架构师谈:高并发网站的监控系统选型、比较、核心监控指标

在高并发分布式环境下,对于访问量大的业务、接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况...

我是你大哥
今天
2
0
华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!

还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线...

华为终端开放实验室
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部