跨越单线程限制:Thread类的魅力,引领你进入Java并发编程的新纪元

线程的概述

线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在。 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。

注意:Java中的多线程是一种抢占机制而不是分时机制。抢占机制指的是有多个线程处于可运行状态,但是一个CPU同时只允许一个线程在运行,他们通过竞争的方式抢占CPU。

线程的状态

NEW(新建状态):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的

RUNNABLE(就绪状态):当一个新建的线程执行Thread.start()以后,线程进入就绪状态。这个状态的线程已经做好了运行的准备工作,但是还没有真正执行run方法的代码。

RUNNING(运行中):当一个就绪状态的线程,被CPU选中,分配时间片开始执行,就进入到运行中状态。这个状态的线程已经在真正执行run方法。

BLOCKED(阻塞状态):一个运行中的线程,有两种情况会进入阻塞状态。一个是等待获取synchronized锁的时候;另外一个是一个获取到synchronized锁的线程调用Object.wait方法后被唤醒,会进入阻塞状态,因为它需要重新获取之前已经得到的锁。该状态下的线程,在取到锁以后,进入就绪状态。

WAITING(等待状态):一个运行中的线程,执行Object.wait()、Thread.join()、LockSupport.park()等方法就会进入等待状态。等待状态的线程,需要被其他线程唤醒(Object.notifyAll()、LockSupport.unpark()),唤醒以后进入就绪状态。

TIMED_WAITING(等待一定时间状态):一个运行中的线程,执行Thread.sleep(timeout)、Object.wait(timeout)、Thread.join(timeout)、LockSupport.parkNanos(timeout)、LockSupport.parkUntil(timeout)等方法进入到等待一定时间状态。这个状态的线程,在等待超时或者被其他线程唤醒后,进入到就绪状态。

TERMINATED(终止状态):一个线程执行完毕或者被异常中断以后进入该状态,该状态下isAlive方法返回false。


b665b8e63af9806c3f3bccb52c452605.jpeg


常用方法

  • start方法

start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。

  • run方法

run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。

  • sleep方法

sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。需要注意的是,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,在sleep生效期间,其他线程是无法获取该对象的synchronized锁。

  • yield方法

调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。yield方法让线程从RUNNING状态回到RUNNABLE状态。

  • join方法

A线程执行B线程的join方法以后,A线程需要等B线程执行完成以后才能继续执行。从状态角度来讲,A线程在执行B线程的join方法以后,A线程进入到WAITING或者TIMED_WAITING状态,一直等到B线程进入到TERMINATED状态或者等待超时以后,A线程才会回到RUNNABLE状态。

  • wait方法

wait方法是Object类就实现的方法,线程执行该方法以后,进入到WAITING或者TIMED_WAITING状态,在被其他线程唤醒或者等待超时后,进入到RUNNABLE状态。需要注意的是,调用wait方法会释放已经获取到锁,等线程被唤醒以后会进入到BLOCKED状态。直到重新拿到锁以后,才会进入到RUNNABLE状态。

  • notify/notifyAll方法

notify/notifyAll方法也是Object类就实现的方法,执行该方法以后,可以唤醒等待队列里面一个/全部线程,让他们进入到RUNNABLE状态。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记2——Nosql

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/194205.html 跟学链接 跟学视频链接:https://www.bilibili.com/video/BV1S54y1R7SB/?spm_id_from333.999.0.0 (建议有java基础的同学学习或者一直…

一天吃透Java面试题

给大家分享我整理的Java高频面试题,有小伙伴靠他拿到字节offer了。 Java基础面试题 Java的特点Java 与 C 的区别JDK/JRE/JVM三者的关系Java程序是编译执行还是解释执行?面向对象和面向过程的区别?面向对象有哪些特性?数组到底是…

为什么嵌入通常优于TF-IDF:探索NLP的力量

塔曼纳 一、说明 自然语言处理(NLP)是计算机科学的一个领域,涉及人类语言的处理和分析。它用于各种应用程序,例如聊天机器人、情绪分析、语音识别等。NLP 中的重要任务之一是文本分类,我们根据文本的内容将文本分类为不…

VS Code关闭受限模式,关闭信任工作区

打开VS code每次出现这个界面,烦戳死!今天,贷款也要把它关掉! 1、打开设置: 2、搜索以下值 security.workspace.trust3、重新启动VS Code即可! 4、或者直接在用户的设置文件 settings.json中加入以下: &…

CMMI V2.2模型介绍

1、CMMI模型内容编排 模型内容主要由三篇组成,包括概述、实践域(PA)和附录,共分为6个章节。 章节 标题说明篇章:概述第1章关于CMMI V2.0概述CMMI V2.0产品套件,包括模型的执行摘要。第2章 成…

whois人员信息python批处理读入与文本输出

使用pytho读取一个ip列表文本,批量获取whois输出并写入到一个文本 import socketif __name__ __main__:# 江苏电信DNS地址mylog open(whois.log, mode a,encodingutf-8)for line in open("ip.txt"):s socket.socket(socket.AF_INET, socket.SOCK_STR…

2023年中职组“网络安全”赛项云南省竞赛任务书

2023年中职组“网络安全”赛项 云南省竞赛任务书 一、竞赛时间 总计:360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服务加固…

算法基础学习|前缀和差分

前缀和 代码模板 一维前缀和模板 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]二维前缀和模板 S[i, j] 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为: S[x2, y2] - S[x1 - 1, y2] - S[x2, …

S4.2.4.3 Electrical Idle Sequence(EIOS)

一 本章节主讲知识点 1.1 EIOS的具体码型 1.2 EIOS的识别规则 1.3 EIEOS的具体码型 二 本章节原文翻译 当某种状态下,发送器想要进入电器空闲状态的时候,发送器必须发送EIOSQ,也既是:电器Electrical Idle Odered Set Sequenc…

服务器数据恢复-RAID5中磁盘被踢导致阵列崩溃的服务器数据恢复案例

服务器数据恢复环境: 一台3U的某品牌机架式服务器,Windows server操作系统,100块SAS硬盘组建RAID5阵列。 服务器故障: 服务器有一块硬盘盘的指示灯亮黄灯,这块盘被raid卡踢出后,raid阵列崩溃。 服务器数据…

unity NPR 卡通渲染

文章目录 一、 介绍二、 素材准备三、 步骤四、 shader代码五、工程链接 一、 介绍 NPR是计算机图形学中的一类,即非真实感绘制(Non-photorealistic rendering),主要用于模拟艺术式的绘制风格,也用于发展新绘制风格,形式一般是卡…

ZooKeeper+HBase分布式集群环境搭建

安装版本:hadoop-2.10.1、zookeeper-3.4.12、hbase-2.3.1 一、zookeeper集群搭建与配置 1.下载zookeeper安装包 2.解压移动zookeeper 3.修改配置文件(创建文件夹) 4.进入conf/ 5.修改zoo.cfg文件 6.进入/usr/local/zookeeper-3.4.12/zkdata…