【Java】Java核心要点总结 69

news2024/11/20 12:36:08

文章目录

  • 1. BIO NIO AIO
  • 2. 多线程
  • 3. 线程的生命周期和状态
  • 4. sleep() ⽅法和 wait() ⽅法对比
  • 5. 为什么 wait() ⽅法不定义在 Thread 中?


在这里插入图片描述

1. BIO NIO AIO


在Java中,BIO、NIO和AIO是针对网络编程的不同I/O模型:

BIO(Blocking I/O):传统的阻塞式I/O模型,它以阻塞的方式进行数据读写操作。当一个线程执行I/O操作时,会被阻塞,直到数据准备好或者操作完成。这种模型相对简单,但对并发处理能力较弱。

NIO(Non-blocking I/O):非阻塞式I/O模型,引入了选择器(Selector)和通道(Channel)的概念。使用NIO,可以通过一个线程处理多个通道的I/O操作,提升了并发处理能力。但需要手动检查是否有数据可用,必要时才进行读写操作。

AIO(Asynchronous I/O):异步I/O模型,也称为NIO.2。在AIO中,数据准备好后会自动通知应用程序进行读写操作,提供了更高级别的异步事件处理机制,可以有效地利用系统资源。

因此,在Java中,BIO适用于连接数较小且吞吐量要求不高的场景,NIO适用于连接数较多但每个连接的交互频率较低的场景,而AIO适用于连接数较多且每个连接的交互频率较高的场景。选择哪种I/O模型取决于应用程序的具体需求。

2. 多线程


程序计数器为什么是私有的? 程序计数器主要有下⾯两个作⽤:

  1. 字节码解释器通过改变程序计数器来依次读取指令,从⽽实现代码的流程控制,如:顺序执⾏、
    选择、循环、异常处理。

  2. 在多线程的情况下,程序计数器⽤于记录当前线程执⾏的位置,从⽽当线程被切换回来的时候能
    够知道该线程上次运⾏到哪⼉了。

需要注意的是,如果执⾏的是 native ⽅法,那么程序计数器记录的是 undefined 地址,只有执⾏的
是 Java 代码时程序计数器记录的才是下⼀条指令的地址。

所以,程序计数器私有主要是为了线程切换后能恢复到正确的执⾏位置。

虚拟机栈和本地⽅法栈为什么是私有的?

虚拟机栈: 每个 Java ⽅法在执⾏的同时会创建⼀个栈帧⽤于存储局部变量表、操作数栈、常量 池引⽤等信息。从⽅法调⽤直⾄执⾏完成的过程,就对应着⼀个栈帧在 Java 虚拟机栈中⼊栈和 出栈的过程。 本地⽅法栈: 和虚拟机栈所发挥的作⽤⾮常相似,区别是: 虚拟机栈为虚拟机执⾏ Java ⽅法 (也就是字节码)服务,⽽本地⽅法栈则为虚拟机使⽤到的 Native ⽅法服务。 在 HotSpot 虚 拟机中和 Java 虚拟机栈合⼆为⼀。 所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地⽅法栈是线程私有的。


3. 线程的生命周期和状态


线程在Java中具有生命周期和状态,主要包含以下几个状态:

新建(New):当创建一个线程对象时,线程处于新建状态。此时线程正在被初始化,但还未开始执行。

运行(Runnable):在新建状态后,调用线程的start()方法会使线程进入就绪状态,并且可以开始执行。处于就绪状态的线程可能正在等待CPU时间片,一旦获得CPU时间片,就可以开始执行。需要注意的是,一个正在运行的线程也是属于就绪状态的一种。

阻塞(Blocked):在某些情况下,线程可能会被阻塞并暂时停止执行,进入阻塞状态。这可能是因为线程在等待某个资源、等待输入/输出完成、或者由于调用了Thread类的sleep()方法而暂停执行。当等待的条件满足时,线程会从阻塞状态恢复到就绪状态。

等待(Waiting):线程进入等待状态表示线程暂停执行,直到其他线程显示地唤醒它。线程可以通过调用wait()方法进入等待状态,也可以调用join()方法使得线程等待另一个线程执行结束。

超时等待(Timed Waiting):与等待状态类似,但是可以设置等待时间。线程可以通过调用带有超时参数的方法,如Thread.sleep()、Object.wait()和Thread.join()来进入超时等待状态。

终止(Terminated):线程的生命周期最终会结束,进入终止状态。线程可以通过执行完run()方法的代码或者因异常而非正常退出来达到终止状态。

需要注意的是,这些状态并不是严格的线性顺序,线程可以在运行、阻塞、等待和超时等待之间切换。这种切换是由操作系统和Java虚拟机自动管理的,程序员通常无需显式控制。


4. sleep() ⽅法和 wait() ⽅法对比


sleep()方法和wait()方法是用于线程暂停执行的两种不同方式,它们之间有以下几点区别:

来源

sleep()方法是Thread类的静态方法,可以直接通过Thread.sleep()调用。
wait()方法是Object类的实例方法,需要在使用前对目标对象进行锁定,并通过synchronized代码块或方法进行调用。
使用方式:

sleep()方法会让当前线程按指定的时间暂时休眠。它不会释放已经获得的锁,并且时间一到会自动唤醒。
wait()方法会让当前线程进入等待状态,并释放该对象上的锁。它需要在其他线程中调用notify()或notifyAll()方法来唤醒等待的线程。

所属类别

sleep()方法属于Thread类,主要用于控制线程的睡眠时间。
wait()方法属于Object类,主要用于多个线程之间同步和通信。

应用场景

sleep()方法常用于模拟耗时操作、定时任务等场景,以及简单的线程间暂停。
wait()方法常用于线程间协作,实现线程的等待、唤醒和通知机制,用于解决线程同步问题。

总的来说,sleep()方法是线程自身的方法,不释放锁且可直接调用,主要用于线程的睡眠;wait()方法是Object类的方法,需在同步块中调用,会释放锁并等待其他线程的唤醒,主要用于线程间通信和同步。


5. 为什么 wait() ⽅法不定义在 Thread 中?


wait()方法没有定义在Thread类中,而是定义在Object类中的原因有以下几点:

等待/通知机制:wait()方法是与notify()和notifyAll()方法配合使用的,它们一起构成了等待/通知机制(wait/notify mechanism)。这个机制允许线程在等待某个条件成立时暂停执行并释放锁,等待其他线程通过通知来唤醒它。

对象级别的操作:等待/通知机制需要应用于共享资源或者多个线程之间的同步和协作。将wait()方法定义在Object类中,使得任何一个Java对象都可以具备等待/通知的能力,而不仅仅局限于Thread类。

灵活性和扩展性:将wait()方法定义在Object类中可以提供更大的灵活性和扩展性。由于线程往往是基于对象进行操作的,可以在任何一个对象上调用wait()方法,并且通过notify()或notifyAll()方法将等待的线程唤醒,实现更细粒度的线程控制和协作。

总之,将wait()方法定义在Object类中是为了支持线程间的等待和通知机制,以及提供更加灵活和扩展的方式来实现线程的同步和协作。




在这里插入图片描述

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

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

相关文章

【kotlin】使用MPAndroidChart实现PieChart(饼图)并设置每个数据的颜色、标签等属性

概述 MPAndroidChart 是 Android 上一个非常流行的开源图表库,它提供了多种类型的图表,包括折线图、柱状图、饼图等。 MPAndroidChart 实现饼图 下面是一个使用 MPAndroidChart 实现饼图的示例代码: 首先,需要在项目的 build.…

Makerbase CANable V2.0 产品简介

一、产品介绍 MKS CANable V2.0模块为MKS CANable V1.0升级版本。CANable 2.0是一款小型低成本开源 USB转CAN分析仪。CANable枚举为您计算机上的虚拟串行端口,并充当 CAN总线接口的串行线路。使用candleLight固件时,CANable在Linux上枚举为本地CAN接口。…

MySQL中float、double以及decimal的用法

1、浮点型和定点型 1.1 浮点型: 浮点型能够表示更大的数据范围,但是容易发生精度的问题 float和double属于浮点型,其取值范围与java中的浮点类型的取值范围相同,float占用4字节,double占用8字节 1.2 定点型&#xf…

springboot校园疫情防控管理与数据可视化系统-计算机毕设 附源码84534

springboot校园疫情防控管理与数据可视化系统 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针…

实战之如何在VUE中播放RTSP实时推流播放解决方案

一、知识点 常见的直播协议有以下几种 RTMP(Real-Time Messaging Protocol)实时消息传输协议:是一种用于互联网应用中的协议,最初由 Adobe 公司设计,用于 Flash Player 向 Flash Media Server 或其他支持 RTMP 的服务…

三、Docker命令及基本使用

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、帮助启动类命令1.1 启动docker1.2 停止docker1.3 重启docker1.4 查看docker状态1.5 开机启动1.6 查看docker概要信息1.7 查看docker总体帮助文档1.8 查看docker命令…

模板文件导出Excel【EasyPoi实战系列】- 第478篇

​历史文章(文章累计470) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 …

慎投!6月有3本SCIE期刊被剔除!(附SCI/SSCI目录下载)

期刊动态:2023年6月SCI、SSCI期刊目录更新 2023年6月20日,科睿唯安更新了WOS期刊目录,继上次5月WOS期刊目录剔除4本SCIE&SSCI期刊之后,此次6月更新又有3本SCIE期刊发生变动,其中有1本期刊被踢出SCIE数据库&#x…

Python基础(18)——Python推导式

Python基础(18)——Python推导式 文章目录 Python基础(18)——Python推导式目标一. 列表推导式1.1 快速体验1.2 带if的列表推导式1.3 多个for循环实现列表推导式 二. 字典推导式1 快速体验 三. 集合推导式四. 总结 目标 列表推导…

PowerShell系列(七)PowerShell当中的Provider介绍

往期回顾PowerShell系列(一):PowerShell介绍和cmd命令行的区别 PowerShell系列(二):PowerShell和Python之间的差异介绍 PowerShell系列(三):PowerShell发展历程梳理 P…

管理类联考——写作——素材篇——论说文——写作素材05——志篇:奉献·公益06——制篇:原则·准则

管理类专业学位联考 (写作能力) 论说文素材 05——志篇:奉献公益 论文说材料: 自己活着,就是为了使别人过得更美好。 ——雷锋 一:道理论据 成人善事,其功更倍;动人善愿,其量无涯。——陈龙正 凡人为善…

谷歌tryOnDiffusion实现了高度逼真的虚拟试穿;ChatGPT 或将推出 AI 应用商店

🦉 AI新闻 🚀 ChatGPT Plus 用户已支持联网和插件功能,OpenAI 或将推出 AI 应用商店 摘要:OpenAI 宣布 ChatGPT Plus 用户已支持联网和插件功能。据外媒 The Information 报道,OpenAI 正考虑为 AI 软件创建一个应用商…

postgresql snapshot快照源码解析, 快照内容生成规则, 可见性是这样判断的

postgresql snapshot快照源码解读 ​专栏内容:postgresql内核源码分析 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 本文主要介绍数据库事务快照,分别从源码实…

VisualSVN Server 5.1.5 Crack

特征 VisualSVN Server 提供以下主要功能。 Active Directory 单点登录 允许用户使用他们当前的 Active Directory 域凭据访问 VisualSVN Server。使用安全 Kerberos V5 或 NTLM 身份验证协议。支持双因素身份验证和智能卡。 多站点存储库复制 使用 VisualSVN 分布式文件系统…

【FPGA入门】第七篇、FPGA实现VGA接口驱动

目录 第一部分、实验结果 1、横的三色彩条效果 2、竖的三色彩条效果 第二部分、VGA驱动基本知识 1、VGA分辨率问题 2、VGA驱动波形 2.1、工业标准的时序波形图 2.2、比上面那张图更容易理解的图 2.3、每个区域对应的时间 2.4、不同分辨率的表格 3、VGA扫描范…

【NeRF大总结】基于NeRF的三维视觉年度进展报告

基于NeRF的三维视觉年度进展报告 清华大学:刘烨斌 原文链接:【NeRF大总结】基于NeRF的三维视觉年度进展报告–清华大学刘烨斌 (by 小样本视觉与智能) 目录 文章目录 基于NeRF的三维视觉年度进展报告01 背景介绍NeRFNeRF与三维视觉三维表征与可微渲染…

信号与系统与MATLAB应用(一)

文章目录 前言一、基本信号表示1、周期方波信号2、周期锯齿波信号3、指数函数信号4、抽样函数信号5、单位阶跃信号 二、信号的基本运算1、信号的相加和相乘2、信号的平移3、信号的反折4、信号的尺度变换(缩展)5、信号的微分和积分未完待续... 前言 说起…

WEBGIS系统整体设计

城市地下电力管线管理系统是一个基于B/S 架构的应用系统。系统的网络拓扑结构如 PostgreSQL 数据库以及文件系统作为数据服务器。另外,使用GeoServer 作为GIS 服务器,提供符合OpenGIS 规定的WFS 、WMS 等协议的GIS 服务。 遵循MVC 的分层设计思想&#x…

第三十四章 开发Productions - ObjectScript Productions - Defining Business Metrics

文章目录 第三十四章 开发Productions - ObjectScript Productions - Defining Business Metrics定义业务指标业务指标简介业务指标属性 单实例和多实例业务指标作为业务服务的业务指标 第三十四章 开发Productions - ObjectScript Productions - Defining Business Metrics 定…

Linux常用命令——ftpwho命令

在线Linux命令查询工具 ftpwho 显示当前每个ftp会话信息 补充说明 ftpwho命令ftp服务器套件proftpd的工作指令,用于显示当前每个ftp会话信息。 语法 ftpwho(选项)选项 -h:显示帮助信息; -v:详细模式,输出更多信…