三.线程的状态

news2025/4/7 17:20:22


正常线程的五大状态 :新建状态,就绪状态,运行状态,阻塞状态,死亡状态

初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。
注意:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中
阻塞(BLOCKED):线程在获取synchronized排他锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作线程显式地唤醒(通知或中断)。
限期等待(Timed Waiting)状态:该状态不同于WAITING,处于这种状态的线程也不会被分配CPU执行时间,不过无须等待其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。
死亡(Dead)状态: 线程执行完了或者因异常退出了run()方法,该线程生命周期结束。

这里写图片描述

 

在这里插入图片描述常用方法介绍
1、sleep()
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。

 

例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

2、join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行。注意该方法也需要捕捉异常。
thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
3、yield()

该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

4、wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。

wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白想学习python?怎么学?

首先,学习Python编程技术,自学或者参加培训学习都适用,每个人都有自己的学习方式和方法。 一:明确自己的学习目标。 不管我们学习什么样的知识,都要对自己的学习目标有一个明确的认识。只有这样才能朝着目标持续的前…

26岁学历低的我,是如何从工厂转行Python工程师?

本人坐标长沙,专科工程造价专业。 转行Python工程师薪资:13K。 饮水思泉,在转行的过程中,同学跟老师们对我的帮助非常大,自己找到工作以后,也试着写篇文章,将自己的心得经验全部分享出来&#…

单例模式及其线程安全问题

目录 ​ 1.设计模式 2.饿汉模式 3.懒汉模式 4.线程安全与单例模式 1.设计模式 设计模式是什么? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的 单例模式的作用就是保证某个…

各类指针的详细介绍

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、基本数据类型指针1.1 指针的…

漏洞丨cve2017-11882

作者:黑蛋 一、漏洞简介 本次漏洞还是一个office溢出漏洞,漏洞编号cve-2017-11882。该漏洞是office一个组件EQNEDT32.EXE引起的栈溢出,通杀office版本2007-2016。 二、复现环境 系统版本 目标程序 调试工具 辅助工具 win7 sp1 x86 off…

【MySQL基础教程】DDL语句详细介绍

前言 本文为 【MySQL基础教程】DDL语句 相关相关内容进行详尽介绍,下边将对数据库操作(包括:查询所有数据库、查询当前数据库、创建数据库、删除数据库、切换数据库等),表操作(包括:查询创建、数…

微信小程序分包及案例

文章目录5. 分包6. 独立分包7. 分包预下载8. 案例-自定义tabbar5. 分包 分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用 时按需进行加载。 可以优化小程序首次启动的下载时间在多团队共同…

微信公众号开发—扫描二维码实现登录方案

😊 作者: 一恍过去💖 主页: https://blog.csdn.net/zhuocailing3390🎊 社区: Java技术栈交流🎉 主题: 微信公众号开发—扫描二维码实现登录方案⏱️ 创作时间: 2022…

非零基础自学Golang 第13章 并发与通道 13.1 概述

非零基础自学Golang 文章目录非零基础自学Golang第13章 并发与通道13.1 概述13.1.1 并行与并发13.1.2 Go并发优势第13章 并发与通道 并发是指在同一段时间内,程序可以执行多个任务。 随着社会需求的发展,光靠硬件的提升是无法满足高并发的需求的&#…

[前端攻坚]:数组去重的几种方法

总结一些日常需要用到的一些api,也是在一些面试中会经常出现的题目,今天分享的是数组去重的几个不同的方法, 同时文章也被收录到我的《JS基础》专栏中,欢迎大家点击收藏加关注。 数组去重的方法 1.set去重 2.map去重 3.for循环in…

Python安装Pycrypto

前言 安装 使用以下命令安装 pip install pycrypto2.6.1报错 如果在安装过程中出现如下错误 则说明系统缺乏相应python开发包,需要进行安装对应的python开发包 解决 在CentOS下,如果是python2.7则使用如下命令安装 yum install python-devel是pyt…

Pytest用例运行及规范

温馨提示 本篇约1600字,看完需3-5分钟,学习学半小时,加油! 先看普通函数运行顺序 import pytestdef test_one():print("我是清安")def test_02():print("--02--")def test_a():print("--a--")de…

BP神经网络的最简Python实现

文章目录神经元BP原理及实现测试BP,就是后向传播(back propagation),说明BP网络要向后传递一个什么东西,这个东西就是误差。 而神经网络,就是由神经元组成的网络,所以在考虑BP之前,还不得不弄清楚神经元是…

endata 电影票房响应数据破解

本文仅供参考学习,如有侵权可联系本人 目标网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9Cb3hPZmZpY2UvQk8vWWVhci9pbmRleC5odG1s加密入口分析 在异步请求那里可以看到请求接口,请求参数并未加密只是响应内容进行了加密,暂时也无法判断加密方…

JavaWeb的Servlet学习之Request03

目录 1.Request 1.1Request执行流程 1.2request对象和response对象的原理 1.3 request对象继承体系结构 1.4request功能: 1.3.1获取请求消息数据 1.获取请求行数据 2.获取请求头 3.获取请求体数据 4.其他功能 4.1获取请求参数通用方式:不论get…

开源CA搭建-基于openssl实现数字证书的生成与分发

目录 一、前言 二、openssl介绍 三、openssl的常用用法 (一)单向加密 (二)生成随机数 (三)生成公钥,私钥 1.生成私钥 2.提取公钥 四、搭建CA (一)创建根CA私钥…

Linux的camera驱动 摄像头调试方法

CameraInfo类用来描述相机信息,通过Camera类中getCameraInfo(int cameraId, CameraInfo cameraInfo)方法获得, 主要包括以下两个成员变量facing,facing 代表相机的方向, 它的值只能是CAMERA_FACING_BACK(后置摄像头&am…

Golang 【basic_leaming】1 基本语法

阅读目录Go 语言变量Go 语言 - 声明变量1. 标准格式2. 批量格式Go 语言 - 初始化与定义变量1. 标准格式2. 编译器推导类型格式3. 短变量声明与初始化Go语言 - 多变量同时赋值Go 语言 - 匿名变量参考资料Go 语言整型(整数类型)1 自动匹配平台的 int 和 un…

新项目为什么决定用 JDK 17了

大家好,我是风筝。公众号「古时的风筝」,专注于后端技术,尤其是 Java 及周边生态。文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面。 最近在调研 JDK 17,并且试着将之前…

阴差阳错,阴阳之变

北京的第一批“杨康”们已经返回到工作岗位,这其中就包括我。简单总结一下我的感染和康复过程,给大家做个样本吧。我属于北京放开的第一波感染者,12.9日当天感觉嗓子干,毫不犹豫,果然是中招了;周末开始发烧…