文档章节

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

Zhao-Qian
 Zhao-Qian
发布于 2013/02/06 12:10
字数 807
阅读 194
收藏 3
点赞 0
评论 0

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

  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
粉丝 309
博文 157
码字总数 237336
作品 0
朝阳
高级程序员
Nova 中的协程 -- 同步 (二)

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

koala bear
2014/09/26
0
0
Java系列文章(全)

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

www19
2017/07/04
0
0
转载--大神的“思想”

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

细雨微风轻诉流年
2016/09/06
19
0
Java并发编程实战--笔记二

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

xunzaosiyecao
2017/10/13
0
0
python高性能编程--001--线程与进程的基本概念

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

王新睿
03/26
0
0
并发编程(一):多线程基础知识

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

mengdonghui123456
2017/08/15
0
0
使用zookeeper序列节点实现不可重入分布式锁

一、前言 在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就...

加多
01/12
0
0
java并发编程——线程池和Executor介绍

第一部分:概述 早期的应用程序大多是单线程串行执行的,虽然程序的任务边界清晰有序,但是执行的效率却很低,尤其是执行花费时间较长的操作,会导致大量的等待和堆积。为了提高程序的执行效...

isam
2016/05/26
91
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
多线程的概念

作者: songlixing 一、程序与进程 1、程序:一段静态的代码。 2、进程:程序的一次动态执行过程,它对应从代码加载、执行到执行完毕的一个完整过程。 3、进程也称任务,支持多个进程同时执行...

虫虫
2011/12/02
657
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部