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{
    @Override
    public 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{
    @Override
    public 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(){
            @Override
            public 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{
    @Override
    public 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 方法");
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

含“AI”量上涨,智能模组SC208系列助力智慧零售全场景高质发展

AI正重塑智慧零售产业,加速零售在采购、生产、供应链、销售、服务等方面改善运营效率和用户体验。零售行业经历了从线下到线上再到全渠道融合发展过程,“提质、降本、增效、高体验”是亘古不变的商业化与智能化方向。含“AI”量逐渐上涨的智慧零售正经历…

【Pt】新建项目时的设置

新建项目时需要在如下界面做一些设置。 一、模板与文件 模板通常选择“PBR - Metallic Roughness Alpha-blend” 文件可以选择fbx,abc,obj等格式的三维模型文件 二、项目设置 2.1 文件分辨率 指的是在软件中的预览效果,分辨率越高预览效果…

RUST egui体验

egui官方提供了web版的demo&#xff0c;效果还是很不错的&#xff0c;就是用的时候有点一头雾水&#xff0c;没有找到明确的指导怎么把这些组件插入到自己的application或者web。花了一天时间撸了一遍流程&#xff0c;记录一下&#xff0c;说不定以后能用到呢 >_< efram…

Redis学习二--常见问题及处理

基本概念 Redis基本概念数据结构 机制 持久化机制&#xff1a; RDB(内存快照)&#xff1a;某一时刻的内存快照以二进制的方式写入磁盘&#xff0c;可以手动触发和自动触发。 优点&#xff1a;生成文件小&#xff0c;恢复速度快&#xff0c;适用于灾难恢复。 缺点&#xff1a…

如何与施耐德Schneider建立EDI连接?

EDI基础知识 何为EDI&#xff1f;是一个软件、系统还是一种流程呢&#xff1f;准确来说&#xff0c;EDI全称Electronic Data Interchange&#xff0c;中文名称是电子数据交换&#xff0c;也被称为“无纸化贸易”。EDI是&#xff1a; 标准化的数据格式连接业务系统间的数据桥梁…

Verilog刷题笔记40

题目&#xff1a; For the following Karnaugh map, give the circuit implementation using one 4-to-1 multiplexer and as many 2-to-1 multiplexers as required, but using as few as possible. You are not allowed to use any other logic gate and you must use a and …

vite脚手架生成vue项目及其配置

认识脚手架 脚手架就是为了快速生成可复用代码的工具&#xff0c;帮你配置好开发过程中要用到的工具和环境&#xff0c;更快更方便地做开发写业务 vite和cli脚手架区别 可参考博主文章&#xff1a; Vue脚手架&#xff08;cli和vite详解&#xff09;_vite和vuecli-CSDN博客 …

JVM的知识

什么是JVM 1.JVM&#xff1a; JVM其实就是运行在 操作系统之上的一个特殊的软件。 2.JVM的内部结构&#xff1a; &#xff08;1&#xff09;因为栈会将执行的程序弹出栈。 &#xff08;2&#xff09;垃圾99%的都是在堆和方法区中产生的。 类加载器&#xff1a;加载class文件。…

花生壳 | ubuntu安装和卸载花生壳

一、到花生壳官网下载linux版本的花生壳 一般下载到Downlaods文件夹 进入文件夹 dpkg -i phddns_5_1_amd64.deb #安装花生壳 dpkg -r phddns #卸载花生壳 登录花生壳管理网站 http://b.oray.com 在Ubuntu中输入命令查看sn码&#xff0c;默认密码为admin phddns status …

年龄大了转嵌入式有机会吗?

有老铁说&#xff0c;我28了&#xff0c;转嵌入式还来得及吗&#xff1f; 其实这个是因人而异的&#xff0c;没有固定说超过多少岁&#xff0c;就不能转了。 我一般不太建议30及以上的转行&#xff0c;第一是30岁才从开始做技术&#xff0c;感觉意义不大。第二是难度大&#xf…

淡旺季酒店价格波动太大,住宿费用怎么管?

受地理位置、季节等因素的影响&#xff0c;部分城市不同季节的酒店价格浮动较大。一线还是二线城市&#xff1f;是淡季还是旺季&#xff1f;价格差距之间可以说是天差地别。 在淡季出差时&#xff0c;按照旺季的标准会导致成本过高&#xff0c;造成资源的浪费。而在旺季出差时&…

python+requests接口自动化测试实战

环境说明&#xff1a; 1.WIN 7, 64位 2.Python3.4.3 &#xff08;pip-8.1.2&#xff09; 3.Requests —>pip install requests 4.Unittest —>unittest 框架是python自带的单元测试框架&#xff0c;python2.1及其以后的版本已将unittest作为一个标准块放入python开发包中…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数&#xff08;通常使用输入函数&#xff09;&#xff0c;确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和&#xff0c;该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系&#xff0c;而传统的固定序列处理方法可能会遗漏这…

LeetCode:2617. 网格图中最少访问的格子数(优先级队列 Java)

目录 2617. 网格图中最少访问的格子数 题目描述&#xff1a; 实现代码与解析&#xff1a; 优先级队列 原理思路&#xff1a; 2617. 网格图中最少访问的格子数 题目描述&#xff1a; 给你一个下标从 0 开始的 m x n 整数矩阵 grid 。你一开始的位置在 左上角 格子 (0, 0) 。…

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09; 建立一个新的函数&#xff0c;用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题&#xff0c;建立新的函数来传参 多采用使用反对值的方法&#xff0c;因为如果是相等return true的话&am…

芯片公司SAP管理架构:科技与管理的完美融合

在当今日新月异的科技时代&#xff0c;芯片公司作为信息技术领域的核心力量&#xff0c;其运营管理的复杂性日益凸显。SAP管理架构作为一种高效的企业资源规划系统&#xff0c;为芯片公司提供了强大的管理支持。本文将为您科普芯片公司SAP管理架构的相关知识。 SAP管理架构是一…

leetcode每日一题1969

目录 一.题目原型&#xff1a; 二思路解析&#xff1a; 三.代码实现: 一.题目原型&#xff1a; 二思路解析&#xff1a; 灵神的做法非常让人惊叹&#xff1a; 理解就是&#xff0c;如果一个数大于另一个数要交换的1的权重&#xff0c;那么他们的乘积就变小。 那么一个大的数…

React 中的懒加载(Lazy Load)

React 中的懒加载&#xff08;Lazy Load&#xff09; 在大型的 React 应用中&#xff0c;为了提高页面加载速度和性能&#xff0c;我们经常会使用懒加载技术来延迟加载组件或资源。懒加载可以将页面初始加载的内容减少到最小&#xff0c;只在需要时再动态加载额外的组件或资源…

js实现hash路由原理

一、简单的上下布局&#xff0c;点击左侧导航&#xff0c;中间内容跟对变化&#xff0c;主要技术使用js检测路由的onhashchange事件 效果图 二、话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"…

Wireshark 抓包工具与长ping工具pinginfoview使用,安装包

一、Wireshark使用 打开软件&#xff0c;选择以太网 1、时间设置时间显示格式 这个时间戳不易直观&#xff0c;我们修改 2、抓包使用的命令 1&#xff09;IP地址过滤 ip.addr192.168.1.114 //筛选出源IP或者目的IP地址是192.168.1.114的全部数据包。 ip.sr…