P25 线程状态

news/2024/10/21 22:55:05/

P25 线程状态

  • 1.线程状态概述
  • 2.TIMED_WAITING(计时等待)
  • 3.BLOCKED(锁阻塞)
  • 4.WAITING(无限等待)
  • 5.补充知识点

系统:Win10
Java:1.8.0_333
IDEA:2020.3.4

1.线程状态概述

当线程被创建并启动之后,它既不是一起动就进入执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在 API 中 java.lang.Thread.State 这个枚举类中给出了六种线程状态:
这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细的解析

线程状态导致状态发生条件
NEW(新建)线程刚被创建,但是并未启动。还没调用start方法
Runnable(可运行)线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器
Blocked(锁阻塞)当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态
Waiting(无限等待)一个线程在等待另一个线程执行一个(唤醒动作时),该线程进入Waiting状态。进入这个状态以后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能唤醒
Timed_Waiting(计时等待)同Waiting状态,有几个方法有超时参数,代用他们将进入Timed Waiting状态。这一状态将一直保持超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep、Object.wait
Terminated (被终止)因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡

目前不需要去研究这几种状态的实现原理,只需要知道在做线程操作中存在这样的状态。那么如何去理解这几个状态,新建与被终止还是很容易理解的,那么就研究一下线程从 Runnable(可运行)状态与非运行状态之间的转换问题

2.TIMED_WAITING(计时等待)

Timed_Waiting 在 API 中的描述为:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。单独的去理解这句话,可能不是很好理解,其实前面我们已经接触过这个状态了
在我们写的卖票案例中,模拟卖票前操作,我们在 run 方法中添加了 sleep 语句,这样就强制当前正在执行的线程休眠(暂停执行)
其实当我们调用了 sleep 方法之后,当前执行的线程就进入到了“休眠状态”,就是所谓的 Timed_Waiting(计时等待),下面我们通过一个案例加深对该状态的一个理解
实现一个计时器,从 0 计数到 59,在每个数字之间暂停一秒(模拟一分钟倒计时)
代码如下

public class MyThread extends Thread{@Overridepublic void run(){for (int i = 0; i < 60; i++) {System.out.println(i);try {// 线程睡眠1秒Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {new MyThread().start();}
}

运行结果
在这里插入图片描述

通过案例可以发现,sleep 方法的使用还是很简单的。我们需要记住下面几点:

  1. 进入 TIMED_WAITING 状态的一种常见情形是调用 sleep 方法,单独的线程也可以调用,不一定非要有协作关系
  2. 为了让其他线程有机会执行,可以将 Thread.sleep() 的调用放在线程 run() 之内,这样才能保证该线程执行过程中睡眠
  3. sleep 与锁无关,线程睡眠到期会自动苏醒,并返回到 Runnable(可运行)状态

提示:sleep() 中指定的时间是线程不会运行的最短时间,因此 sleep() 方法不能保证该线程睡眠到期后会立刻开始执行
Timed_Waiting 线程状态图
在这里插入图片描述

3.BLOCKED(锁阻塞)

Blocked 状态在 API 中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态
我们前面已经学完同步机制,那么这个状态是非常好理解的,比如线程 A 与线程 B 代码中使用同一锁,如果线程 A 获取到锁,线程 A 进入到 Runnable 状态,那么线程 B 就进入到 Blocked 锁阻塞状态
这是由 Runnable 状态进入 Blocked 状态,除此 Waiting 以及 Time_Waiting 状态也会在某种情况下进入阻塞状态
Blocked 状态线程状态图
在这里插入图片描述

4.WAITING(无限等待)

Waiting 状态在 API 中的介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态
下面我们通过一段代码来了解下

/*** 线程一先获取到锁对象,在同步代码块中调用wait方法,释放锁,进入无限等待状态-waiting* 线程二开始执行,获取到线程一释放的锁,执行完毕,调用notify唤醒含有wait方法的线程* 线程一获取到锁,从无限等待状态醒来,继续执行*/
public class WaitingDemo {public static Object obj = new Object(); // 锁对象public static void main(String[] args) {// 演示waitingnew Thread(new Runnable() {@Overridepublic void run() {synchronized (obj) {try {System.out.println(Thread.currentThread().getName() + "获取到锁对象,调用wait方法,进入waiting状态,释放锁对象!");obj.wait(); // 无限等待} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "从waiting状态醒来,获取到锁对象,继续执行!");}}}, "线程一").start();new Thread(new Runnable() {@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName() + "开始执行!");Thread.sleep(1000); // 睡眠1秒,让线程一先获取到锁对象} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj) {System.out.println(Thread.currentThread().getName() + "获取到锁对象,执行完毕,调用notify方法,释放锁对象!");obj.notify(); // 唤醒一个含有wait()方法的线程}}}, "线程二").start();}
}

运行结果
在这里插入图片描述

通过上面案例我们可以发现,一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 对象或 Object.notifyAll() 方法
其实 waiting 状态并不是一个线程的操作,它体现的是多个线程的通信,可以理解为多个线程之间的协作关系,多个线程会争取锁,同时相互之间又存在协作关系。就好比在公司里的你和你的同事,你们可能存在晋升时的竞争,但更多的时候是一起合作以完成某些任务
当多个线程协作时,比如 A,B 线程,如果 A 线程在 Runnable(可运行)状态调用了 wait() 方法,那么 A 线程就进入 Waiting(无限等待)状态,同时失去同步锁。假如这个时候线程 B 获取到同步锁,在运行状态中调用了 notify() 方法,那么就会将无限等待的 A 线程唤醒。注意的是唤醒,如果获取到锁对象,那么 A 线程就进入 Runnable(可运行)状态;如果没有获取锁对象,那么就进入到 Blocked(锁阻塞状态)
Waiting 线程状态图
在这里插入图片描述

5.补充知识点

到此我们对于线程状态有了基本认识,想要了解更多,可见下图
在这里插入图片描述

提示:我们在翻阅 API 的时候发现 Timed_Waiting(计时等待)与 Waiting(无限等待)状态联系还是很紧密的,比如 Waiting(无限等待)状态中 wait 方法时空参的,而 Timed_Waiting(计时等待)中 wait 方法是带参的。这种带参的方法,其实是一种倒计时操作,相当于我们生活中的小闹钟,我们约定好时间,到时通知,可是如果提前得到(唤醒)通知,那么设定好时间再通知就显得多此一举了,那么这种设计方案其实是一举两得。如果没有得到(唤醒)通知,那么线程就处于 Timed_Waiting 状态,直到倒计时完毕自动醒来,如果在倒计时期间得到(唤醒)通知,那么线程从 Timed_Waiting 状态立刻醒来


http://www.ppmy.cn/news/429820.html

相关文章

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者&#xff0c;从Chat2DB开源至今都有关注这个开…

ios10怎么设置电池颜色_苹果手机电池颜色变黄了怎么调

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 苹果手机电池颜色变黄了的调整方法是&#xff1a; 1、打开手机&#xff0c;点击设置。 2、在设置界面点击“电池”一栏&#xff0c;进入后关闭“低电量模式”右边滑块&#xff0c;电…

用什么方法可以远程恢复苹果手机丢失的数据呢

苹果手机不小心误删了照片怎么办 今天小编在视频网站上看到了一段iphone 6概念机的设计视频&#xff0c;这也让很多的果粉又燃起了攒钱的动力。不得不说&#xff0c;苹果手机在细节方面确实有自己的一套。特别是很瘦女孩子喜欢。就单拿照相功能来说&#xff0c;苹果相机拍出来的…

苹果手机上网很慢_手机信号满格,但网速却很慢?无非是这4种原因,看完你就知道了...

众所周知&#xff0c;互联网信息时代&#xff0c;人们的生活已然离不开网络了&#xff0c;而连接网络的方式分为两种&#xff0c;一种是连接WiFi上网&#xff0c;一种是使用移动数据上网。虽然说&#xff0c;5G网络已经在国内展开普及&#xff0c;但是面对高昂的5G套餐资费&…

苹果xr如何截屏_iphone敲两下截屏如何操作 苹果手机触控截屏方法【教程步骤】...

iphone敲两下截屏如何操作?相信小伙伴们一定很好奇,下面小编为大家带来了苹果手机触控截屏方法教程详解,感兴趣的小伙伴赶紧跟着小编一起来看看吧 iphone敲两下截屏怎么设置 轻点两下进行截屏其实是苹果手机利用辅助触控功能实现的,这个功能使用前是需要提前进行设置的,如…

苹果库乐队怎么玩_学会这个,自己给苹果手机换来电铃声

苹果手机较早之前就可以在手机上制作铃声了,但是还是不少朋友都不知道怎么操作,今天来一套利用库乐队制作铃声的教程,收藏码住再看防止忘记哦。 首先我们要在苹果手机上下载‘’库乐队‘’这个软件,软件是免费的,APP STORE搜索就行。制作铃声以QQ音乐为例,因为现在大部分…

多开分身苹果版_【教程】苹果手机居然可以微信分身?全套教程,进来领取

微信分身版下载后,是可以同一个手机登陆多个微信号的,如果你不知道苹果手机微信分身怎么用?苹果手机怎么下载微信分身版的话,一起来看看wed114结婚网小编为大家提供的详细介绍吧。 苹果手机微信分身怎么用 1、点击“下载微信分身版”; 应用名称:微信多开分身版6.2.6下载v6…

云计算机手机apple,云电脑IOS版怎么在苹果IOS手机上使用教程

不管你是新手还是老手,很多人对云电脑的移动端还认为只有安卓版,最近极云普惠云电脑推出的云电脑IOS版很多人都不知道怎么入手,下面给大家带来怎么在苹果IOS手机上的使用教程,希望能够让你的苹果手机轻松变成电脑玩PC游戏。 云电脑IOS版经过了数个月的研发终于在3月份对所有…