文档章节

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

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
粉丝 310
博文 160
码字总数 240935
作品 0
朝阳
技术主管
私信 提问
Nova 中的协程 -- 同步 (二)

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

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

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

飞鱼说编程
昨天
0
0
转载--大神的“思想”

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

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

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

www19
2017/07/04
0
0
Java并发编程实战--笔记二

第5章:基础构建模块      ConcurrentHashMap 与其他并发容器一起增强了同步容器类:他们提供的迭代器不会抛出 ConcurrentModificationException ,因此不需要在迭代过程中对容器加锁。 ...

xunzaosiyecao
2017/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java.util.concurrent.locks.AbstractOwnableSynchronizer 抽象类 源码

java.util.concurrent.locks.AbstractOwnableSynchronizer 源码: package java.util.concurrent.locks;public abstract class AbstractOwnableSynchronizer implements java.io.S......

狼王黄师傅
14分钟前
1
0
在MaxCompute上分析IP来源的方法

摘要: 在MaxCompute上分析IP来源和供应商 淘宝IP库 淘宝IP地址库官网地址http://ip.taobao.com/,其查询接口[http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]](http://ip.taob...

阿里云官方博客
25分钟前
2
0
死灰复燃的Security

一直以来,Spring系列给人的感觉都是快速,简洁,好理解,易操作.但Security是一个特例,这个框架相比而言,首先就是复杂,其次是灵活性也不够.好在于是Spring出的,因此与Spring配合比较好.并且在S...

melon_jj
37分钟前
2
0
druid 和 HikariCP 的简单配置

maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.14</version> </dependency>......

晨猫
41分钟前
2
0
安装RabbitMQ(一)

安装RabbitMQ(一) 安装Erlang (https://packages.erlang-solutions.com/erlang/) 添加EPEL源 [root@bogon ~]#cd /usr/local[root@bogon local]#rpm -Uvh https://dl.fedoraproject.org/pub......

keppy
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部