Java EE 进程线程

JavaEE 进程&线程

文章目录

  • JavaEE 进程&线程
    • 1. 进程
      • 1.1 概念
      • 1.2 进程管理
      • 1.3 PCB (Process Control Block)
    • 2. 线程
      • 2.1 概念
      • 2.1 线程与进程的区别
      • 2.3 创建线程

1. 进程

1.1 概念

什么是进程?

进程是操作系统对一个正在执行的程序的一种抽象

我们可以打开任务管理器,里面每个正在执行的程序就是一个进程:

在这里插入图片描述

: 我们可以认为,程序 = 进程 (跑起来的程序) / 可执行文件(没有运行起来的程序)

而对于进程来说,它们在执行的过程中都需要消耗一定的硬件资源

在这里插入图片描述

结论:

  • 进程是系统分配资源的基本单位

  • 内存管理:每个进程的内存是彼此独立,互不干扰的。通常情况下,进程A不能直接访问进程B的内存,这种情况也称为进程独立性

  • 进程间通信:虽然有进程的独立性,但有时候也需要多个进程相互配合完成某个工作,这个时候就要用到进程间通信。进程间通信和进程的“独立性”并不冲突,系统提供一些公共的空间(多个进程都能访问到的),让两个进程借助这种公共空间来交互数据

1.2 进程管理

在操作系统中,进程管理可以分为两个步骤:

  1. 先描述: 使用PCB将核心属性描述出来
  2. 再组织: 使用一定的数据结构(在Linux中一般使用链表),把对应进程的PCB串到一起

下面将对PCB进行具体解释~

1.3 PCB (Process Control Block)

PCB 是指操作系统中的进程控制块Process Control Block),也称为任务控制块(Task Control Block)。每个正在运行或等待执行的进程都有一个对应的 PCB

进程的一些重要信息就存储在PCB中:

  • PID(Process ID)进程的身份标识,系统会保证同一个机器上,在同一时刻每个进程的pid都是唯一的;

  • 内存指针(Memory Pointers):描述进程使用内存资源的详细情况,如哪里存放数据,哪里存放指令;

  • 文件描述符表(File descriptor table):描述进程使用了的硬盘的相关信息;

  • 优先级(Process Priority):表示进程的相对重要性或优先级。操作系统可以根据进程的优先级来进行调度,以决定哪个进程先执行;

  • 进程状态(Process State):记录进程当前的状态,如运行、就绪,阻塞(等待控制台输入)等。这是操作系统用于判断进程是否可以执行的关键信息;

  • 进程调度(Process Scheduling):针对每个进程占据了cpu多长时间进行一个统计,根据这个统计结果来进一步的调整调度的策略;

  • 上下文(Context):类似于存档与读档。其中保存上下文就是把CPU的关键寄存器中的数据保存到内存中(PCB的上下文属性中),而恢复上下文就是把内存中的关键寄存器中的数据加载到CPU的对应寄存器中

PCB扮演着操作系统中的重要角色,通过保存和维护进程的状态和上下文信息,操作系统可以在进程之间进行切换和调度!!

2. 线程

引子:进程的使用能够解决“并发编程”的问题,但进程本身在进行频繁创建和销毁的时候,开销也比较大(开销主要体现在资源的申请和释放上),而线程能够解决这个问题!

2.1 概念

什么是线程?

一个线程就是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码,多个线程之间可以“同时”执行多份代码

线程也可以称为“轻量级进程”,在进程的基础上做出了改进,同时,线程在系统中的调度规则和进程是一样的,线程的PCB中也有状态、优先级、上下文、记账信息…

2.1 线程与进程的区别

  • 进程是包含线程的,每个进程至少有一个线程存在,即主线程

  • 进程和进程之间不共享内存空间,而线程与线程之间共享一个内存空间;

    在这里插入图片描述

    多个线程的PCB中的内存指针都指向同一个内存空间,这就意味着只有在创建第一个线程的时候需要从系统中分配资源,后续的线程就不必分配,直接共用前面分配的资源就可以,这大大降低了资源频繁申请释放带来的开销!

  • 进程是系统分配资源的基本单位,线程是系统调度的基本单位

  • 进程与进程之间不会相互影响,一个进程挂了一般不会影响其它正在执行的进程,但线程不一样,一旦一个线程挂了很可能会把同个进程中的其它线程一起带走,导致整个进程一起崩溃;

  • 因为共享同一个内存空间,同一个进程中的线程可能会相互干扰,从而造成线程安全问题;

  • 线程也不是越多越好,线程太多调度开销也会很大

2.3 创建线程

创建线程有以下几种方式:

  1. 继承Thread类

    • 先继承Thread来创建一个线程类

      class MyThread extends Thread {@Overridepublic void run() {System.out.println("这里是线程运行的代码");}
      }
      
    • 创建MyThread类的实例

      Thread myThread = new MyThread();
      
    • 调用start方法启动线程

      myThread,start(); //线程开始运行
      

      在这里插入图片描述

    从上述代码可以发现,我们并没有用对象.方法名的方式调用run方法,但却依旧能够执行run方法,关键就在于:

    • 线程在调用start()方法的时候才正式构建
    • run()方法相当于这个线程的入口方法,此处的run方法不需要我们手动调用,而会在线程创建好之后(即调用start方法后)被JVM自动调用执行
  2. 实现Runnable接口

    • 实现Runnable接口

      class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("这是线程运行的代码");}
      }
      
    • 创建Thread类实例,调用Thread的构造方法时将Runnable对象作为target参数

      Thread t = new Thread(new MyRunnable());
      
    • 调用start方法

      t.start(); //线程开始运行
      

      在这里插入图片描述

  3. 匿名内部类创建Thread子类对象

    package demo1;public class DemoThread3 {public static void main(String[] args) {Thread t1 = new Thread() {@Overridepublic void run() {System.out.println("使用匿名类创建Thread子类对象");}};t1.start();}
    }
    

    在这里插入图片描述

  4. 匿名内部类创建Runnable子类对象

    package demo1;public class DemoThread5 {public static void main(String[] args) {Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("使用匿名类创建Runnable子类对象");}});t2.start();}
    }
    

    在这里插入图片描述

  5. 使用lambada表达式创建Runnable子类对象

    package demo1;public class DemoThread5 {public static void main(String[] args) {Thread t3 = new Thread(() -> {System.out.println("这里使用lambda表示式相当于实现Runnable接口并重写了run方法");});t3.start();}
    }
    

    在这里插入图片描述
    因为lambda表达式写起来比较简洁,所以我们一般使用lambda表达式来创建线程。

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

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

相关文章

Python编程基础

Python是一种简单易学的编程语言,广泛应用于Web开发、数据分析、人工智能等领域。无论您是初学者还是有一定编程经验的人士,都可以从Python的基础知识开始建立自己的编程技能。 目录 理论Python语言的发展程序设计语言的分类静态语言与脚本语言的区别 代…

Allegro层叠中的介电常数如何填写指导说明

Allegro层叠中的介电常数如何填写指导说明 在用Allegro进行PCB设计的时候,需要在cross-section中设置好每个层的信息,包括层命名,每层的厚度等等信息。如下图 一般来说,这些信息就足够了 但是对于有仿真需求或者等长设计需要使用ps作为延时单位的设计的时候,需要额外在层…

JVM基础篇:垃圾回收

1.前言 1.1C/C的内存管理 在C/C这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。内存泄漏指的…

Express内置的中间件

自Express 4.16.0 版本开始,Express 内置了3个常用的中间件,极大的提高了 Express 项目的开发效率和体验: 1.express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等 (无兼容性) 2.express.json 解析JSON 格式的请…

6.12找树左下角的值(LC513-M)

算法: 这道题适合用迭代法,层序遍历:按层遍历,每次把每层最左边的值保存、更新到result里面。 看看Java怎么实现层序遍历的(用队列): /*** Definition for a binary tree node.* public clas…

C++——解锁string常用接口

本篇的内容是记录使用string接口的测试与使用,方便后续使用时查阅使用 首先介绍 string::npos; size_t(无符号整型)的最大值。NPOS 是一个静态成员常量值,具有 size_t 类型元素的最大可能值。当此值用作字符串成员函数中 len&am…

Linux多路转接select,poll

文章目录 目录 文章目录 一、五种IO模型 1.阻塞IO: 2.非阻塞IO 3.信号驱动IO 4.IO多路转接 5.异步IO 二、高级IO的一些重要概念 1.同步通信和异步通信 2.阻塞和非阻塞 三、其他高级IO 四、非阻塞IO 1.fctl函数 2.实现setNoBlock函数,将文件描述符设置…

D365 CRM Power Platform 后端开发概览

博主十年前写的后端技术文章大部分都out-of-date啦,有些东西还能在PP系统中继续沿用,大部分东西都变成old fashion了。 博主后续争取多找些时间,将之前的后端开发文档都翻新一遍,争取与时俱进,让它们还能继续使用下个…

C++const指针的两种用法

const int *p &a; 指向const变量的指针 指向const变量的指针const修饰的变量,只能由指向const变量的指针去指向 p &a1;const的位置,必须在*的左边指向const变量的指针,可以被改变,可以指向别的变量可以指向普通变量&am…

好玩的调度技术-生成式三维技术

好玩的调度技术-生成式三维技术 文章目录 好玩的调度技术-生成式三维技术前言一、效果图?二、技术实现系列文章链接其他文章新篇章 前言 目前休息了,预计休息半年,这半年里只会零星更新一些好玩的技术,感觉好玩系列都快成系列文章…

css之fade 动画效果

1.transition-group transition-group官方文档<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 2.代码 <div class"senior-panel"><transition-group name"fade">&…

九、基础算法精讲:动态规划二

目录 一、状态机DP1.1 买卖股票的最佳时机 II&#xff08;不限制交易次数&#xff09;1.2 买卖股票的最佳时机含冷冻期1.3 买卖股票的最佳时机 IV1.4 买卖股票的最佳时机含手续费 二、区间DP2.1 最长回文子序列2.2 多边形三角剖分的最低得分2.3 由子序列构造的最长回文串的长度…

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境&#xff0c;可以参考文章&#xff1a; 详解如何使用VS code搭建JavaScript环境&#xff08;适合小白&#xff09;_vscode配置javascri…

LeetCode Hot100 437.路径总和III

题目&#xff1a; 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

不可错过的设计工具!7款亲测好用的网页设计工具推荐!

网页设计并不容易&#xff0c;易于使用的网页设计工具更难找到。随着网络的快速发展&#xff0c;网站迅速崛起&#xff0c;网页设计也很流行。本文收集了 7 种良心和易于使用的网页设计工具&#xff0c;每一种近年来都受到网页设计师的广泛欢迎&#xff0c;以确保实用和易于使用…

抵御代码重用攻击:指针认证(PAC)和分支目标识别(BTI)

目录 一、代码重用攻击历史 二、小工具(Gadgets):它们是什么?为什么它们很危险? 三、ROP攻击

前端技术探秘-Nodejs的CommonJS规范实现原理 | 京东物流技术团队

了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。Node中增添了很…

免费商用字体,进来领取!!!

如果你不知道去哪里找免费可商用字体&#xff0c;那一定要收藏好这几个网站&#xff0c;全部都是免费无版权字体&#xff0c;以后再也不用担心侵权问题了。 1、免费字体网 https://font.sucai999.com/ 一个免费可商用字体搬运工&#xff0c;实时跟新市面上免费商用的字体。网站…

高性能无锁队列 moodycamel::ConcurrentQueue

在做一些服务器的架构设计的时候,你不得不考虑现成模型的设计,将不同的业务划分到不同的线程里,如何来调度这些任务是一个值得有经验的架构师需要思考的工作。 很多开发者一说到线程的任务调度就想到了线程池,给他创建一个线程池,多个线程不断地尝试获取任务的信号,一旦线…

国家万亿资金助力城市生命线城市内涝积水监测系统

自2023年年初以来&#xff0c;我国多个地区遭遇了洪涝、干旱、台风、风雹等灾害的侵袭&#xff0c;部分地区灾情严重&#xff0c;经济损失较大。为应对灾后恢复重建工作的艰巨任务&#xff0c;本次国债将主要投向灾后恢复重建以及提升防灾减灾救灾能力。其中&#xff0c;将全面…