java main生命周期_Java从入门到入土(62)线程的生命周期
线程是程序内部的一个顺序控制流,他具有一个特定的生命周期。在一个线程的生命周期中,他总是处于某一种状态中。线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务。
线程的生命周期包括五个状态:创建,就绪,运行,阻塞和死亡。任何一个线程总是处于这五种阶段的某一种状态。
创建状态:是指使用new运算符实例化一个线程类对象,但该对象还未使用start()方法启动该对象,这个阶段只是在堆内为该对象的实例变量分配了空间,但该线程对象还无法参与抢占cpu的使用权。
就绪状态:就绪状态也称为可运行状态,实例化后的线程对象调用start()方法之后,该线程就处于了就绪状态,意味着该线程随时可以运行,他需要和其他处于就绪状态的线程争夺cpu的使用权。
运行状态:一旦某个线程拥有了cpu的使用权,那么此时线程便处于运行状态,它可以变为阻塞状态、就绪状态和死亡状态,其中就绪状态是运行状态的唯一入口。
阻塞状态:处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时线程进入阻塞状态,阻塞状态可以转换为就绪状态,以便再次运行。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:调用线程的sleep()或join()方法,或发出I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者I/O处理完毕,线程重新转入就绪状态。
死亡状态:一旦线程对象的run()执行完毕之后,就表明该线程的历史使命已经完成,也就意味着该线程进入了死亡状态。java虚拟机会销毁处于死亡状态的线程对象占用的系统资源。一个线程死亡之后不会再回归到线程的其他三种状态。一个线程在以下三种情况下,会结束并且进入死亡状态:
自然撤销:指从线程的run()方法执行完毕后正常退出;
强制退出:调用stop()方法可以强制停止当前线程,但是由于stop()方法会导致死锁,目前该方法已过时,不推荐使用。
线程执行时遇到一个未捕获的异常,线程被终止并且进入死亡状态。
如下为线程生命周期图:
举一个简单的例子,代码解释见注释:public class HelloWorld implements Runnable {
public void run() {
// 获取当前系统时间
Long t1 = System.currentTimeMillis();
// 使用Thread类的currentThread()方法获取当前线程对象
// 接着使用getName()方法获取当前线程的名称
System.out.println(Thread.currentThread().getName() + "开始执行");
// 调用sleep()方法会抛出InterrupttedException异常,用try-catch语句捕获
try {
// 使用sleep()方法阻塞线程,2000为毫秒
System.out.println(Thread.currentThread().getName() + "线程进入阻塞状态");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + "线程阻塞结束,继续执行");
} catch (Exception e) {
e.printStackTrace();
}
// 计算线程阻塞所用的时间
Long t2 = System.currentTimeMillis() - t1;
System.out.println(Thread.currentThread().getName() + "执行结束,其中阻塞时间为:" + t2);
}
public static void main(String[] args) {
HelloWorld t1 = new HelloWorld();
// 创建3个线程并启动
for (int i = 1; i < 4; i++) {
new Thread(t1, "第" + i + "个线程:").start();
try {
// 每一个线程间隔1000毫秒
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行后控制台输出如下:第1个线程:开始执行
第1个线程:线程进入阻塞状态
第2个线程:开始执行
第2个线程:线程进入阻塞状态
第1个线程:线程阻塞结束,继续执行
第1个线程:执行结束,其中阻塞时间为:2000
第3个线程:开始执行
第3个线程:线程进入阻塞状态
第2个线程:线程阻塞结束,继续执行
第2个线程:执行结束,其中阻塞时间为:2000
第3个线程:线程阻塞结束,继续执行
第3个线程:执行结束,其中阻塞时间为:2001
此时,如果将上述sleep()方法中的参数进行改变,亦或是将此方法注释掉,对于运行结果是否有改变?请大家思考以便加深对于线程生命周期的理解。
java main生命周期_Java从入门到入土(62)线程的生命周期相关推荐
- java session 生命周期_java之hibernate之session中对象的生命周期
1. session是用来执行对象的crud操作,并且session是对象事务工厂.session是线程级别的,所以生命周期比较短. 2.session中对象的生命周期图: 3.session中对象的 ...
- java多租户架构_Java 多租户:配置选项、租户生命周期和所使用的隔离性
Java 多租户:配置选项.租户生命周期和所使用的隔离性 IBM SDK Java Technology Edition(第 7 版的第 1 个发行版)中多租户实现的深入研究 Gavin Rolles ...
- java面向对象怎么学_Java面向对象入门
Java面向对象入门 一.Java面向对象的基本组成 Java类及类的成员:属性.方法.构造器:代码块.内部类 面向对象三大特征:封装.继承.多态(抽象) 关键字:this.super.static. ...
- java string逆序_java经典入门算法题,java初学者必备
java经典入门算法题 开头求关注警告 喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!需要更多java学习资 料的也可以私信我! 祝关注我的人都:身体健康,财源广进,福如东海,寿比 ...
- java单引号转义_Java基础入门——Java语言基础(上)
本篇我们开始进入Java的学习,首先在学习如何编写Java语言前要先了解Java程序的基本结构. 一.Java程序的基本结构 一个Java程序的基本结构大体可以分为包.类.main()主方法.标识符. ...
- java object转泛型_JAVA快速入门——基本结构、基本数据类型
Java程序基本结构 一个完整的Java程序基本结构: 下面我们来一点点解剖上面代码的含义: class是关键字,这里定义的class名字就是HelloWorld: 类名必须以英文字母开头,后接字母, ...
- java编程输出平行四边形_JAVA语言入门教程之打印图形实例——打印平行四边形...
本文主要向大家介绍了JAVA语言入门教程之打印图形实例--打印平行四边形,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 输出平行四边形: public class Parallelo ...
- java语言打印图形_JAVA语言入门教程之打印图形实例——打印矩形
本文主要向大家介绍了JAVA语言入门教程之打印图形实例--打印矩形,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 输出矩形: public class Rect { public s ...
- java main 参数传递参数_Java千问:Java语言如何给main方法传递参数?
大家都知道,Java语言运行程序的入口方法叫做main,这个方法有一个参数,这就表示说,我们要运行主方法,就必须给main方法传递一个参数.但是,大家似乎对这个参数向来都是视而不见,从来都没给主方法传 ...
最新文章
- 趣文:一根网线发起的攻击
- android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...
- urb数据结构【转】
- jquery datatable的详细用法
- 前端学习(808):复杂数据类型传参
- 绝地求生6月28日服务器维护,绝地求生6月28日更新到几点 吃鸡6月28日更新内容一览...
- Python将绝对路径转换为相对路径方法实例
- 冬日圣诞节海报还没灵感?看这里!
- 大数据下,谁来保护裸奔的个人隐私
- 磁盘调度算法课程设计(附源代码)
- 用户手册 (V4.0 版)
- cadence17.2制作封装过程
- AmazeUI 图标的示例代码
- Python变量赋值方法
- 英语语法 定冠词与专有名词
- DWARF调试格式的简介
- 1602LCD主要技术参数
- 暑假实习 + 提前批 +校园招聘(更新中)
- 网站的布局类型有哪些,想知道吗?
- 神经协同过滤Neural Collaborative Filtering(NCF)
热门文章
- Confluence 6 配置文件和key
- String Reduction问题分析
- SVN 两种存储格式(BDB和FSFS)区别
- 华为总裁任正非谈企业管理:正确的方向来自于妥协
- 10分钟认识RAID磁盘阵列技术!!!
- java使用线程求素数和1000个0~0.9随机数_求素数(多线程练习题)
- 激光打标软件_走向工业自动化生产之路——激光飞行打标
- python 批量下载 代码_Python + Selenium +Chrome 批量下载网页代码修改
- linux命令的使用实验报告,Linux实验报告一-常用命令使用.doc
- 将xscj指定为当前数据库_(2)连接登陆数据库