文档章节

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

Credo-Zhao
 Credo-Zhao
发布于 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异常.

© 著作权归作者所有

共有 人打赏支持
Credo-Zhao
粉丝 309
博文 167
码字总数 244237
作品 0
朝阳
技术主管
私信 提问
Nova 中的协程 -- 同步 (二)

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

koala bear
2014/09/26
0
0
18《Java核心技术》之一个线程两次调用start()方法会出现什么情况?

一、提出问题 今天我们来深入聊聊线程,相信大家对于线程这个概念都不陌生,它是 Java 并发的基础元素,理解、操纵、诊断线程是 Java 工程师的必修课,但是你真的掌握线程了吗? 今天我们要一...

飞鱼说编程
2018/11/15
0
0
转载--大神的“思想”

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

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

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

www19
2017/07/04
0
0
python高性能编程--001--线程与进程的基本概念

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

王新睿
2018/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows命令行杀死占用端口的进程

假如要查看的端口号是80: netstat -aon|findstr "80" 这个时候我们会看到下面的 TCP 127.0.0.1:80 0.0.0.0:0 LISTENING 2448 最后,杀死进程 taskkill /f /t......

hengbao5
13分钟前
1
0
c++ 定义新的异常

#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main......

天王盖地虎626
今天
3
0
PDMan-2.1.1 发布:用心开源,免费的国产数据库建模工具(春节前最后一个版本)

一、软件介绍 PDMan 是一款开源免费的数据库模型建模工具,是PowerDesigner之外另一种更好的选择。支持Windows,Mac,Linux等操作系统,具有上手容易,使用简单的特点。 2018年获得码云GVP (Gi...

O龙猫O
今天
21
0
OSChina 周二乱弹 —— 以后我偷小鱼干养你

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @庞巴哥 :只有这节奏瞬间变得轻松。。。。。。。。。分享Talking Eyes的单曲《In the sun (Extended Version)》: 《In the sun (Extended Ve...

小小编辑
今天
834
10
多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部