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…

C#使用ASP.NET Core Razor Pages构建网站(三)

上一篇文章了解Razor Pages 链接:C#使用ASP.NET Core Razor Pages构建网站(二) 接下来继续了解ASP.NET Core Razor Pages构建网站的后续内容 一、将Entity Framework Core配置为服务 要在 ASP.NET Core 项目中配置 Entity Framework Core 服…

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

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

【Caddy】Caddy实践1——此网站无法提供安全连接

背景:卸载 最近安装Caddy在另外一个机器上出现了错误,执行步骤如下: 步骤一:添加 Caddy 软件源并安装 执行以下命令添加 Caddy 的软件源并安装: sudo apt install -y debian-keyring debian-archive-keyring apt-t…

哨兵位、链表的链接

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

java入门学习

程序员必备:常见算法与应用综述 算法是计算机科学的核心,是解决问题的关键。在程序员的日常工作中,算法无处不在。本文将以“程序员常用的几种算法”为主题,从多个维度介绍程序员常用的算法,并分析其适用场景、优缺点…

在 CentOS 7 上编译安装 Nginx 1.18

1. 安装依赖包 首先,安装 Nginx 所需的基本依赖包: yum install -y gcc gcc-c make automake autoconf pcre-devel zlib-devel openssl-devel2. 下载 Nginx 源代码 wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -xzvf nginx-1.18.0.tar.g…

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…

5.81 BCC工具之tcpconnlat.py解读

一,工具简介 tcpconnlat工具追踪执行活动TCP连接的内核函数(例如,通过connect()系统调用),并显示本地测量的连接延迟(时间):从发送SYN到响应数据包的时间。 二,代码示例 #!/usr/bin/env pythonfrom __future__ import print_function from bcc import BPF from soc…

shentou思路流程

信息收集: 1、获取域名whois信息也就是所谓的资产收集 2、服务器子域名、旁站、c段查询 3、服务器操作系统类型、版本、补丁状况、开放端口:22 ssh 80 web 445 3389.。。 4、web中间件类型、版本、网站目录结构、使用的waf等设备 5、数据库类型、版…

Linux运维_Bash脚本_构建安装MySQL-8.0.18

Linux运维_Bash脚本_构建安装MySQL-8.0.18 Bash (Bourne Again Shell) 是一个解释器,负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件,并于 1989 年发布的免费软件,作为 Sh (Bourne Shell) 的替代品。 您可以在 Linux …

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

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

【C语言基础篇】内存处理函数(二)memove的介绍及模拟实现

个人主页: 倔强的石头的博客 系列专栏 :C语言指南 C语言刷题系列 待完善补充

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

前言 本播放器内部采用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系统相关技术…