博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程 — 线程的通信 — 线程的生命周期和状态概述
阅读量:4978 次
发布时间:2019-06-12

本文共 1193 字,大约阅读时间需要 3 分钟。

生命周期:线程也是有生命周期的,也是存在不同的状态的,状态相互之间的转换。

新建状态,就绪状态,运行状态,阻塞状态,死亡状态。

有人把阻塞状态,等待状态,计时等待状态合称为阻塞状态

线程对象的状态存放在Thread类的内部类(State)中:

注意:Thread.State类其实是一个枚举类。因为线程对象的状态是固定的,只有6种,此时使用枚举来表示是最恰当的。

新建状态(new):使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前。

新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已。

Thread t = new Thread();//此时t就属于新建状态

当新建状态下的线程对象调用了start()方法,此时从新建状态进入可运行状态。

线程对象的start方法只能调用一次,否则报错

 

可运行状态(runnable):分成两种状态,reday和running。分别表示就绪状态和运行状态。

就绪状态:线程对象调用start方法之后,等待JVM的调度(此时该线程并没有运行)

运行状态:线程对象获得JVM调度,如果存在多个CPU,那么允许多个线程并行运行

 

阻塞状态(blocked):正在运行的线程因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态

  此时JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转到运行状态

  阻塞状态只能先进入就绪状态,不能直接进入运行状态

阻塞状态的两种情况:

  当A线程处于运行过程时,试图获取同步锁时,却被B线程获取,此时JVM把当前A线程存到对象锁池中,A线程进入阻塞状态

  当线程处于运行过程时,发出了IO请求时,此时进入阻塞状态

 

等待状态(waiting)(等待状态只能被其他线程唤醒):此时使用的无参数wait()方法。

  当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中

 

计时等待状态(timed waiting)(使用了带参数的wait方法或者sleep方法)

  当线程处于运行过程时,调用了wait(long time)方法,此时JVM把当前线程存在对象等待池中

  当线程执行了sleep(long time)方法

 

终止状态(terminated):通常称为死亡状态,表示线程终止。

  正常执行完run方法而退出(正常死亡)

  遇到异常而退出(出现异常之后,程序就会中断)(意外死亡)

线程一旦终止,就不能再重新启动,否则报错

 

在Thread类中过时的方法(因为存在线程安全问题,所以弃用了):

void suspend():暂停当前线程

void resume():恢复当前线程

void stop():结束当前线程

 

转载于:https://www.cnblogs.com/wenxudong/p/6537450.html

你可能感兴趣的文章
Fireworks基本使用
查看>>
Java基础常见英语词汇
查看>>
nginx启动、关闭命令、重启nginx报错open() "/var/run/nginx/nginx.pid" failed
查看>>
BZOJ 3097 Hash Killer I
查看>>
UINavigationController的视图层理关系
查看>>
html阴影效果怎么做,css 内阴影怎么做
查看>>
BZOJ1026: [SCOI2009]windy数
查看>>
组件:slot插槽
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
highcharts 图表实例
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
宏定义
查看>>