JavaEE 初阶篇-深入了解进程与线程(常见的面试题:进程与线程的区别)

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 进程概述

        2.0 线程概述

        2.1 多线程概述

        3.0 常见的面试题:谈谈进程与线程的区别

        4.0 Java 实现多线程的常见方法

        4.1 实现多线程方法 - 继承 Thread 类

        4.2 实现多线程方法 - 实现 Runnable 接口


        1.0 进程概述

        一个程序运行起来,就会对应一个进程,进程是系统分配资源的基本单位。每个进程都有自己的地址空间、代码、数据、堆栈等资源,可以独立运行并与其他进程隔离。

进程特点:

        1)进程是程序的执行实例,是计算机系统中最基本的执行单位。

        2)每个进程有自己的地址空间、资源和状态,相互独立运行,互不干扰。

进程的状态:

        1)就绪态(Ready):进程已经准备好运行,等待系统分配处理器资源。

        2)运行态(Running):进程正在执行指令,占用处理器资源。

        3)阻塞态(Blocked):进程因等待某些事件发生而暂时停止运行。

        4)终止态(Terminated):进程执行完毕或被终止,释放资源。

        2.0 线程概述

        是进程中的实际执行单元。线程是系统调度执行的基本单位。一个进程可以包含一个或多个线程,共享进程的资源,但每个线程有自己的栈空间和执行路径。

线程特点:

        1)线程是进程中的执行单元,可以看作是轻量级的进程。

        2)同一进程中的线程共享进程的地址空间和资源,可以直接访问进程的全局变量和数据。线程共享进程的资源,减少资源的重复占用,提高资源的利用效率。

        3)线程之间的切换比进程之间的切换更快速,因为线程共享相同的地址空间。

线程的状态:

        1)就绪态(Ready):进程已经准备好运行,等待系统分配处理器资源。

        2)运行态(Running):进程正在执行指令,占用处理器资源。

        3)阻塞态(Blocked):进程因等待某些事件发生而暂时停止运行。

        4)终止态(Terminated):进程执行完毕或被终止,释放资源。

        2.1 多线程概述

        多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务或操作。在Java中,多线程可以让程序更高效地利用计算机的多核处理器,提高程序的性能和响应速度。

        3.0 常见的面试题:谈谈进程与线程的区别

        1)资源占用方面上的区别:

        进程拥有独立的地址空间和资源,进程与进程之间相互独立,即使一个进程出现了某些因素的影响,不能运行了,另一个进程也不会受到影响。

        线程共享所属进程的地址和资源,包括全局变量、栈空间等,线程之间可以直接通信。若在一个进程中有若个线程中,即使只有一个线程出现问题,那么所有的线程都有可能会收到影响。

        2)通信和同步方面上:

         进程通信比较复杂,需要使用 IPC 机制,如管道、消息队列、共享内存等。

        线程之间共享进程的资源,可以直接访问全局变量,线程通信更加方便。

        3)切换开销方面上的区别:

        进程切换的开销比较大,需要保存和恢复整个进程的状态,包括内存映像、寄存器等。

        线程切换的开销比较小,因为线程共享进程的资源,只需要保存和回复线程的稀有数据。

举个例子:

线程与进程的区别:

        4.0 Java 实现多线程的常见方法

        1)继承 Thread 类。2)实现 Runnable 接口。

        4.1 实现多线程方法 - 继承 Thread 类

        先创建一个类继承 Thread 类,重写 run 方法。还需要在主函数中利用 start 方法启动。这样就创建了一个线程,调用 start 方法之后,系统会自动调用重写的 run 方法,也就是回调函数。交给系统执行 run 方法。

        在 mian 中也是一个线程,称为主线程,主线程是自动创建的,而 thread 线程则是我们手动创建出来的。

代码如下:

public class demo1 {public static void main(String[] args) {Thread thread = new MyThread();thread.start();while (true){System.out.println("正在执行主线程");}}
}class MyThread extends Thread{@Overridepublic void run() {while (true){System.out.println("正在执行 run 线程");}}
}

运行结果:

以上代码和运行结果都是多线程所展示的,接下来对比一下单线程代码和运行结果:

public class demo1 {public static void main(String[] args) {Thread thread = new MyThread();thread.run();while (true){System.out.println("正在执行主线程");}}
}class MyThread extends Thread{@Overridepublic void run() {while (true){System.out.println("正在执行 run 线程");}}
}

        注意观察,这里没有用到 start 方法,那么就意味着没有创建新的线程当前是主线程。因为没有创建新的线程,所以就不会有系统自动调用重写的 run 方法,那么我们自己手动调用 run 方法也是可以的,不过还是在同一个线程里面,并没有创建新的线程。因此,这里只能输出 "正在执行 run 线程" 这条语句,只能等到这循环结束后,才会执行下一个循环,因为在同一个线程里面,不能多并行。

运行结果:

        除了以上方法可以看出来是否是多线程代码,还可以用到 jconsole.exe 这个应用程序,直观的感受出来。还是用到以上的多线程代码,来观察:

进入的页面找到相应的 .java 文件:

进入后,可以看到一个 java 应用程序运行的时候,至少有 15 个线程: 

可以我们手动创建的线程 Thread-0 还有自动创建的主线程:

        剩下的线程都是 jvm 帮我们做的一些其他工作,涉及到的负责垃圾回收的,负责记录调试信息的......

详细补充:

        1)start 方法调用操作系统提供的“创建线程”的 API ,在内核中创建对应 PCB ,并且把 PCB 加入到链表中。run 方法则是在进一步的系统调度到这个线程了之后,系统自动就会执行上诉 run 方法中的逻辑。

        2)多线程的调度顺序是无序的,在操作系统内部也称为“抢占式执行”。任何一个线程,在执行到任何一个代码的过程中,都可以被其他线程抢占掉它的 cpu 资源,于是 cup 就给别的线程执行了。这样的抢占式执行,充满了随机性,正是这样的随机性,使多线程的程序,执行效果,也会难以预测,甚至可以会引入 bug 。

        除了以上的写法之外,还有用匿名内部类形式。

代码如下:

public class demo2 {public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run() {while(true){System.out.println("正在运行 run 方法");}}};thread.start();while (true){System.out.println("正在运行 main 方法");}}
}

还可以用 lambda 方式进行进一步的简化:

public class demo2 {public static void main(String[] args) {Thread thread = new Thread(() -> {while (true){System.out.println("正在运行 run 方法");}});thread.start();while (true){System.out.println("正在运行 main 方法");}}
}

        4.2 实现多线程方法 - 实现 Runnable 接口

        为了提高代码的灵活性,可以将线程的任务与线程本身分离,使代码结构更清晰。

        先实现 Runnable 接口,一样的需要重写 run 方法,再把这个实例作为参数传入到创建 Thread 类中。最后调用 start 方法启动线程。

代码如下:

public class demo3 {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();while (true){System.out.println("正在运行 main 方法");}}}
class MyRunnable implements Runnable{@Overridepublic void run() {while (true){System.out.println("正在运行 run 方法");}}
}

同样也可以用匿名类内部类方式:

public class demo4 {public static void main(String[] args) {Thread thread = new Thread(()-> {while(true) {System.out.println("正在运行 run 方法");}});thread.start();while (true){System.out.println("正在运行 main 方法");}}
}

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

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

相关文章

理解文件操作

1. 为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化…

Visual Studio 插件 AnAPI++ for VS 2022

Anmial API abbreviation AnAPIis an automatically generated WebAPI project that has encapsulated Jwt Oauth2 token authentication, SqlSugar, Swagger, Nlog, Cross domain technologies, and supports Net6 and above versions Anmial API缩写AnAPI是一个自动生成的Web…

基于SpringBoot和HeatMap的全球地震热力图可视化实践

目录 前言 一、关于热力图 1、HeatMap简介 2、属性和方法介绍 二、全球地震热力图反演 1、地震信息查询开发 2、前端地图开发 三、地震带反演成果 1、三大地震带反演 2、地震区域分析 总结 前言 众所周知,全球的地震带主要可以分为三处地震带——环太平洋地…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口:7001,历史漏洞:CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞:CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

使用jupyter-Python进行模拟股票分析

tushare财经数据接口包 pip install tushare作用:提供相关指定的财经数据 需求:股票分析 使用tushare包获取某股票的历史行情数据 输出该股票所有收盘比开盘上涨3%以上的日期 输出该股票所有开盘比前日收盘跌幅超过2%的日期 假如我从2015年1月1日开…

哨兵位、链表的链接

哨兵位: 通俗的话讲就是额外开辟一块空间,指向链表的头部。 合并两个有序链表 已解答 简单 相关标签 相关企业 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入&#…

Jupyter R绘图 汉字显示乱码的解决办法

1.Jupyte中,R绘图,汉字显示乱码 2.如何解决? (1)R中安装showtext 登录linux服务器 #R > install.packages(“showtext”) … 出错 (2)退出R,安装freetype-config #apt install libfreetype6-dev 出错 (3)进入R&…

学习人工智能:Attention Is All You Need-2-Transformer模型;Attention机制;位置编码

3.2 注意力机制Attention 注意力函数可以描述为将查询和一组键值对映射到输出的过程,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中每个值的权重由查询与相应键的兼容性函数计算得出。 3.2.1 缩放点积注意力 Scaled Dot-Product Attenti…

鸿蒙Harmony应用开发—ArkTS-@AnimatableExtend装饰器:定义可动画属性

AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。 可动画属性:如果一个属性方法在animation…

无插件网页视频播放器,支持图像绘制(包含方格子、方框等),支持音视频播放、支持录像截图,提供源码下载

前言 本播放器内部采用jessibuca插件接口,支持录像、截图、音视频播放等功能。播放器播放基于ws流,图像绘制操作:1)支持绘制方格子,用于监控移动检测画框;2)支持绘制不透明方框,用于…

macOS下Java应用的打包和安装程序制作

文章目录 macOS应用程序结构Java应用打包JavaAppLauncherjpackage其它相关JDK命令附录JavaAppLauncher源码链接macOS应用程序结构 macOS通常以dmg或pkg作为软件发行包,安装到/Applications下后,结构比较统一。 info.plist里的CFBundleExecutable字段可以指定入口,如果不指定…

基于JavaWeb+BS架构+SpringBoot+Vue+O2O生鲜食品订购小程序系统的设计和实现

基于JavaWebBS架构SpringBootVueO2O生鲜食品订购小程序系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图 文末获取源码 Lun文目录 目 录 摘 要 I Abstract II 1 绪 论 1 1.1课题研究背景及意义 1 1.2研究现状 1 1.3本论文的主要论文结构 3 2系统相关技术…

【工具使用】VScode如何设置中文环境

操作步骤 1.1 安装中文插件 1.2 设置为中文,然后重启 按照插件的使用方法介绍设置中文: 按下“CtrlShiftP”组合键以显示“命令面板”: 输入“dispaly”,选择“Configure Display Language”: 选择“中文简体” …

使用Python和OpenFOAM进行流体力学模拟的基础示例

流体力学模拟通常涉及复杂的数学方程和数值方法,例如计算流体动力学(CFD)。OpenFOAM是一个开源的CFD工具箱,它使用C编写,但可以通过Python脚本进行自动化和定制。 以下是一个简单的示例,展示如何使用Python和OpenFOAM进行流体力学…

【练习】双指针算法思想

🎥 个人主页:Dikz12🔥个人专栏:Java算法📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 1. 移动零 1.1 题目描述 1.2 讲解算法原理 1.3 编…

代码随想录 动态规划-子序列问题-子序列(连续)

目录 674.最长连续递增序列 718.最长重复子数组 53.最大子数组和 674.最长连续递增序列 674. 最长连续递增序列 简单 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&…

数字孪生底层技术框架

数字孪生是一种将现实世界中的物理实体、过程或系统数字化并映射到计算机模型中的方法。它在数学建模与仿真方面具有重要作用,为了实现数字孪生,以下是一些底层技术框架和方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业…

企业网络基础设施物理安全面临全新挑战

企业网络基础设施的物理安全是确保业务连续性和数据完整性的关键组成部分。随着技术的发展和环境的变化,这些基础设施面临着新的挑战。以下是一些主要的挑战和的解决方案 一、机房、仓库、档案馆物理安全事件频发的挑战: 1.电力安全事件:市…

AI智能分析网关V4在养老院视频智能监控场景中的应用

随着科技的快速发展,智能监控技术已经广泛应用于各个领域,尤其在养老院这一特定场景中,智能监控方案更是发挥着不可或缺的作用。尤其是伴随着社会老龄化趋势的加剧,养老院的安全管理问题也日益凸显。为了确保老人的生活安全&#…

没有磁盘整列下的多机分布式存储:使用rysnc+多服务器文件/文件夹内容同步

目录 0.为什么要定时同步 1.程序安装 2.文件夹设置rsync使用 3.使用cron进行定时任务 0.为什么要定时同步 作为科研党,实验室有多个服务器,但是都是分批买的没有上磁盘整列,所以一个服务器上跑的东西并不能同步,有时候挂任务要…