当前位置: 首页 > news >正文

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表达式来创建线程。

相关文章:

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 概念 什么是进程? 进程是操作系统对一个正在执行的程序的一种抽象 我们可以打开…...

GPT写SQL的模版

表:profit_loss_sum_m_snapshot 计算字段:成本cost_whole求和,收入income_whole求和,收入求和-成本求和,成本目标cost_target求和,收入求和-成本目标求和 条件:日期statis_date在2023-11-01&…...

蓝桥杯官网练习题(平均)

问题描述 有一个长度为 n 的数组( n 是 10 的倍数),每个数 ai 都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等…...

【无标题】动手学深度学习_现代神经网络_未完

这里写目录标题 深度学习之前的网络 AlexNetAlexNet得到了竞赛冠军AlexNet架构Alex net更多细节数据增强 VGGNiN知识补充flop暂退法 drop_out 深度学习之前的网络 1、核方法 机器学习 SVM现在还是很广泛的使用,因为对调参的需求不那么大,对调参不太敏感…...

Java王者荣耀

GameFrame 图片 package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;import javax.soun…...

【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令

🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🍠操作寄存器实现UART🍟UART原理🍟编程 🍠…...

python 左值查找 右值查找

左值查找 在一组数据中查找出 数字x 在这组数据中第一次出现的索引并输出,没有找到则输出-1查找方式:二分查找 数据前提:一组数据要有序一组数据: arr [2, 3, 3, 3, 5, 7, 9, 11, 13, 15, 17]测试: 示例1&#xff…...

机器学习之自监督学习(四)MoCo系列翻译与总结(二)

MoCo中相关工作的对比分析 去噪自动编码器(Denoising Autoencoder)是一种用于学习数据表示的神经网络模型。它的主要目标是通过去除输入数据中的噪声,学习到输入数据的有用表示,从而提高模型对干净数据的鲁棒性。下面是对去噪自动…...

元宇宙企业3d数字展厅轻松低本搭建更全面、多元、趣味化的展览

对所有企业来说,拥有一个3D线上展厅是互联网营销必不可少的部分,但是3D线上展厅定制周期长费用高,让很多企业公司望而却步,web3d开发公司制作的3D线上企业展厅制作平台备导览地图、语音解说、交互热点、全景漫游、自主行走、链接跳…...

华为OD机试真题-开源项目热榜-2023年OD统一考试(C卷)

题目描述: 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源项目的热…...

深入探索Maven:优雅构建Java项目的新方式(一)

Maven高级 1,分模块开发1.1 分模块开发设计1.2 分模块开发实现 2,依赖管理2.1 依赖传递与冲突问题2.2 可选依赖和排除依赖方案一:可选依赖方案二:排除依赖 3,聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤…...

Shopee如何入驻?如何防封?

Shopee作为东南亚领航电商平台,面向东南亚蓝海市场,近年来随着东南亚市场蒸蒸日上,虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…...

2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书

2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书 2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux&am…...

Python编程基础

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

python类和对象

1.使用对象组织数据 class Student:nameNone #记录名字 stu1Student() #创建对象 stu1.name"abc" #为对象属性赋值2.类的定义和使用 2.1成员方法的定义语法 传参的时候self是透明的,不用管 class Stu:nameNonedef sayHi(self):print(f"你好&#x…...

ubuntu操作系统中docker下Hadoop分布式前置环境配置实验

版本: centos7 hadoop 3.1.3 java JDK:1.8 集群规划: masterslave1slave2HDFS NameNode DataNode DataNode SecondryNameNode DataNode YARNNodeManager ResourceManage NodeManager NodeManager 1.docker容器: 把普通用户加入到docker组&am…...

【Linux学习笔记】protobuf 基本数据编码

https://zhuanlan.zhihu.com/p/557457644https://zhuanlan.zhihu.com/p/557457644 [新文导读] 从Base64到Protobuf,详解Protobuf的数据编码原理本篇将从Base64再到Base128编码,带你一起从底层来理解Protobuf的数据编码原理。本文结构总体与 Protobuf 官…...

OpenCV快速入门:图像分析——图像分割和图像修复

文章目录 前言一、图像分割1.1 漫水填充法1.1.1 漫水填充法原理1.1.2 漫水填充法实现步骤1.1.3 代码实现 1.2 分水岭法1.2.1 分水岭法原理1.2.2 分水岭法实现步骤1.2.3 代码实现 1.3 GrabCut法1.3.1 GrabCut法原理1.3.2 GrabCut法实现步骤1.3.3 代码实现 1.4 Mean-Shift法1.4.1…...

BART - 磁共振重建库 linux系统安装 MATLAB 使用

本文主要介绍如何在linux系统中安装伯克利大学的磁共振重建库BART 和在matlab中的配置使用。 安装必要的库 (linux 命令行) $ sudo apt-get install make gcc libfftw3-dev liblapacke-dev libpng-dev libopenblas-dev 下载编译BART 文件 (官网链接:BART Toolbox) 命令行下…...

在linux下在官网的nginxtar包 的安装方式并配置全局变量

在Linux系统中,Nginx是一种流行的Web服务器和反向代理服务器,它可以提供高性能的静态内容服务和动态内容服务。本文将详细介绍如何在Linux系统中安装Nginx,并配置全局变量。 安装Nginx 以下是在Linux系统中安装Nginx的步骤: 1.…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...