多线程2-多线程编程
引入
当我们想要代码能够实现并发执行时,我们可以使用多进程进行并发编程(在Java中并不推荐这种方式,许多API在Java标准库中都没有提供),也可以使用多线程进行并发编程(系统提供了相关的API,Java标准库已经对这些API进行了封装,在代码中可以直接使用)。
创建线程
方法1 继承Thread类
//1、创建一个自己的类,继承Thread
//java.lang是默认导的
class MyThread extends Thread{@Overridepublic void run() {//run方法是该线程的入口方法,不需要手动调用,会在合适的时机(线程创建好之后)被jvm自动调用执行->回调函数System.out.println("hello world");}
}
public class ThreadDemo1 {public static void main(String[] args) {//main方法是java进程的入口方法//2、根据刚才的类创建出实例(线程实例,才是真正的线程)Thread thread = new MyThread();//3、调用Thread的start方法,才会真正调用系统api,在系统内核中创建出线程,线程就会执行上面的run方法thread.start();}
}
注意:(1)这里的Thread类是在java.lang这个包中的,这个包包含了Thread类,这个包是JVM自动导入的无需声明。(2)这里如果调用的是run()方法是没有创建新的线程的,而使用start()方法是创建了新的线程的。(3)run()方法,并不需要程序员手动调用,该方法会在线程创建好之后,在合适的时机被JVM自动调用执行。(这种方法也被称为回调函数,如使用PrioriyQueue的时候,它会自动调用Comparator接口的compareTo方法)。
知识补充:什么是操作系统的内核?
通过之前的学习,我们知道了操作系统的作用:1、管理硬件资源。2、为软件提供稳定的运行环境。为了完成上述两项作用,就需要有操作系统的内核:操作系统中,最核心部分的功能模块。
操作系统大致可以分为内核空间(内核态)和用户空间(用户态),平时运行的普通的应用程序,QQ音乐,idea,抖音等等都,都是运行在用户态的。但是这些应用程序有时需要针对一些系统提供的硬件资源来进行操作。这些操作,都不是应用程序直接操作的,需要调用操作系统提供的API,进一步在内核中完成这样的操作。
为什么要分出用户态和内核态呢?
主要目的还是稳定。防止某些应用程序把硬件设备或者软件资源搞坏了。系统封装了一些API,这些API都属于一些“合法”的操作,不会对硬件设备或者软件资源有所破坏,应用程序只能提供这些API来实现对应的功能,从而不至于对系统/硬件设备产生太大的危害。假如让应用系统直接操作硬件,在极端条件下,代码会出现bug,把硬件整坏。
把操作系统比作是银行,办公窗口里的工作人员就是操作系统的内核,用户要办理各种业务,就需要在办事窗口前,给工作人员说清楚需求,由工作人员来处理这些业务。
多线程演示:
每个线程都是一个独立的执行流,每个线程都能够独立的去CPU上调度执行。
代码:
package Thread;
class MyThraed2 extends Thread{@Overridepublic void run() {while(true){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class ThreadDemo2 {//可通过jdk—bin—jconsol来监视线程public static void main(String[] args) {//t线程中MyThraed2 t = new MyThraed2();t.start();//主线程中//两个独立的执行流while(true){System.out.println("hello true");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
注意:这里使用sleep方法,是为了让执行的结果能够被我们看到,如果不添加,打印的结果会很快,我们看起来不明显。 这个sleep方法需要处理异常,这个异常是因为在sleep(1000)的过程中可能会被提前唤醒。(换句话说:这个程序可能在休眠1s的过程中,被其他操作提前唤醒·,也就是没休眠够1s,就被唤醒了),我们可以在catch方法中让编译器去处理这个异常,也可以直接通过throws关键字把这个异常抛出去。但是,在run方法中只能使用try—catch方法,这是因为run方法是一个重写方法,使用throws方法就相当于修改方法签名了。
下图所示的循环是在t线程中执行的:
下图所示的循环是在main线程中执行的:
以我们之前的理解,如果代码中出现了两个死循环,则只能执行一个循环,另一个循环就进不去了。但是我们把当前进程运行起来,可以发现,两个循环都在运行,且打印的顺序不确定。 该打印结果印证了刚开始那句话:每个线程都是一个独立的执行流,每个线程都能够独立的去CPU上调度执行。同时也说明了上一篇文章中的:线程的随机调度/抢占式执行。
下面我们来剖析线程的调度过程:在调用start方法,创建线程之后,兵分两路,一路沿着main方法,继续执行,打印hello true,另一路,进入到线程的run方法中,打印hello thread。这两个进程是相互独立,互不干扰的。
主线程,在调用start方法之后,就理科往下执行打印了,与此同时,内核要通过刚才API构建出线程,并调用run方法。由于创建线程有一定的开销。所以,在第一轮打印时,hello thread一般会比hello true 略慢一筹。
通过jconsole监视多个线程
我们可以通过jdk提供的第三方工具jconsole工具,来监视java进程的情况:
注意:要对线程进行监视,首先要把进程运行起来。
选择刚才的线程进行连接:
进去之后点击线程:
main对应的就是main方法的主线程。
Thread-0就是我们刚才所创建的t线程(这个Thread-0、1、2……是默认名称,可以修改)。
剩下的线程都是JVM自带的线程,这些自带的线程,要完成一些垃圾回收,监控统计各种指标……
点进具体的线程,就可以看到相关的调用栈(线程里当前执行到了那个方法的第几行代码,这个方法是如何如何一层调用过去的...)
这里这个线程的在不断的运行的,点击线程详细情况的这个瞬间,就相当于闪照一样,把这一瞬间的状态展示到这里了。
方法2 实现Runnable接口,重写run方法
package Thread;
class MyThread3 implements Runnable{//不仅仅可以搭配线程执行@Overridepublic void run() {while(true){System.out.println("hello runnable");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class ThreadDemo3 {public static void main(String[] args) {//这种写法相当于把线程和要执行的任务解耦合了//Runnable runnable = new MyThread3();//只是一段可执行的的代码//Thread t = new Thread(runnable);Thread t = new Thread(new MyThread3());t.start();while(true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
方法3 继承Thread,重写run,但是使用匿名内部类
package Thread;public class ThreadDemo4 {public static void main(String[] args) {Thread thread = new Thread(){//{}意思是定义一个类,这个类继承自Thread,此处最主要的目的是重写run方法,与此同时还创建了一个子类的实例@Overridepublic void run() {while (true) {System.out.println("Hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};thread.start();while(true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
方法4 实现Runnable,重写 run,匿名内部类
package Thread;public class ThreadDemo5 {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while(true){System.out.println("hello runnable");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}});thread.start();while (true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
方法5 使用lambda表达式(最常用)
package Thread;public class ThreadDemo6 {public static void main(String[] args) {Thread thread = new Thread(() ->{while (true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});thread.start();while (true){System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
相关文章:
多线程2-多线程编程
引入 当我们想要代码能够实现并发执行时,我们可以使用多进程进行并发编程(在Java中并不推荐这种方式,许多API在Java标准库中都没有提供),也可以使用多线程进行并发编程(系统提供了相关的API,Ja…...
电商系统中单商户和多商户的区别
在电商的商业版图上,单商户与多商户模式如同两条并行的发展脉络,各自构建起独特的商业生态。它们在运营逻辑、商业模式等多方面存在显著差异,这些差异不仅塑造了不同的平台特性,也深刻影响着企业的发展路径。接下来,我…...
【东枫科技】代理英伟达产品:智能网卡的连接线
文章目录 总览详细:NVIDIA 400Gb/s QSFP-DD 线缆详细:NVIDIA 400Gb/s OSFP 线缆详细:NVIDIA 200Gb/s QSFP56 线缆详细:NVIDIA 100Gb/s QSFP28 线缆 总览 详细:NVIDIA 400Gb/s QSFP-DD 线缆 详细:NVIDIA 400…...
使用ip池后,爬虫还被封,是什么原因呢?
嘿,亲爱的小伙伴们!今天我们聊一个让很多爬虫工程师抓狂的问题:明明用上了IP池,结果爬虫还是被封了!怎么回事呢?如果你也曾在爬虫与反爬的“猫鼠游戏”里痛苦“翻车”,别着急,这篇文…...
C++23 新利器:深入解析栈踪迹库 (P0881R7)
文章目录 为何需要标准化的栈踪迹?P0881R7 的核心组件与使用基本用法示例与异常处理的集成优势与价值潜在的考量总结 对于 C 开发者而言,调试和错误诊断一直是开发周期中不可或缺但又充满挑战的一环。当程序崩溃或发生未预期行为时,获取清晰、…...
2025-05-06 事业-独立开发项目-记录
摘要: 2025-05-06 事业-独立开发项目-记录 独立开发项目记录 Product Hunt | InDev 独立开发者导航站https://www.producthunt.com/ Nomads.com - Best Places to Live for Digital Nomads (formerly Nomad List)https://nomads.com/ InDev 独立开发者导航站https://indev.bei…...
【Linux系统】探索进程等待与程序替换的奥秘
文章目录 前言一、重谈进程创建1.1 fork 函数1.2 写时拷贝1.3 fork 的常规用法1.4 fork 调用失败的原因1.5 创建一批进程 二、进程终止2.1 进程退出场景2.2 strerror 函数的作用2.3 errno 全局变量2.4 程序异常机制2.5 进程退出方式 三、进程等待3.1 进程等待必要性3.2 进程等待…...
Github 2025-05-06Python开源项目日报 Top10
根据Github Trendings的统计,今日(2025-05-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10C++项目2TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…...
【愚公系列】《Manus极简入门》021-音乐创作助手:“音符魔术师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
【Azure Redis】Redis导入备份文件(RDB)失败的原因
问题描述 在测试Azure Redis的导入/导出备份文件的功能中,突然发现在Redis 4.0上导入的时候,一直报错。 image.png 问题解答 因为门户上只是显示导入失败,没有任何错误消息说明。根据常理推断,Redis 的RDB文件格式都具有一致性。居…...
git “分离头指针”(detached HEAD) 状态。
在 Git 中,当你运行 git branch 命令时,看到如下输出: * (detached from 5b596b5)master 其中的: * (detached from 5b596b5) 表示你当前处于 “分离头指针”(detached HEAD) 状态。 🧠 什…...
Gitee的介绍
目录 1.Gitee介绍: 1.1 代码托管 1.2 本土化优势 1.3 企业级服务 1.4 开源生态 1.5 多形态适配 定位:国内开发者首选的高效代码协作平台,兼顾个人开源与企业级私有开发需求。 2.Gitee和GitHub区别 3.Gitee使用教程 4.Gitee相关…...
NoUniqueKey问题和Regular join介绍
问题背景 在flink任务中,遇到了 NoUniqueKey Join的情况,导致了数据膨胀,和下游结果与数据库数据不一致问题 那NoUniqueKey Join为什么会导致问题呢,下面是其中一种场景示例: 为什么会出现 NoUniqueKey :…...
TC8:SOMEIP_ETS_027-028
SOMEIP_ETS_027: echoUINT8 目的 检查method方法echoUINT8的参数及其顺序能够被顺利地发送和接收 说白了就是检查UINT8数据类型参数在SOME/IP协议层的序列化与反序列化是否正常。 UINT8相比于测试用例SOMEIP_ETS_021: echoINT8中的SINT8数据类型来说,属于无符号整数,也就是…...
小微企业SaaS ERP管理系统,SpringBoot+Vue+ElementUI+UniAPP
小微企业的SaaS ERP管理系统,ERP系统源码,ERP管理系统源代码 一款适用于小微企业的SaaS ERP管理系统, 采用SpringBootVueElementUIUniAPP技术栈开发,让企业简单上云。 专注于小微企业的应用需求,如企业基本的进销存、询价&#…...
css filter 常用方法函数和应用实例
1. blur() 模糊 filter: blur(半径);参数:模糊半径(像素),值越大越模糊 示例:filter: blur(5px);2. brightness() 亮度 filter: brightness(百分比); 参数:1原始对比度,0全灰,>…...
chrome inspect 调试遇到的问题
1、oppp 手机打开webview 的时候, 报错这个并没有页面 Offline #V8FIG6SGLN75M7FY Pending authentication: please accept debugging session on the device. 解决方法,保持chrome 浏览器在显示的状态 去设置里开启usb 调试再关闭,反复重…...
Kotlin 中 List 和 MutableList 的区别
在 Kotlin 中,List 和 MutableList 是两种不同的集合接口,核心区别在于可变性。 Kotlin 集合框架的重要设计原则:通过接口分离只读(read - only)和可变(mutable)操作,以提高代码的安…...
openssl 生成自签名证书实现接口支持https
1.下载安装openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 2.配置环境变量 将 openssl 的目录(D:\tools\openssl\bin)添加到 path 中 3.生成自签名证书 找一个存证书的目录打开powershell 3.1 生成私钥 openssl gen…...
React 中集成 Ant Design 组件库:提升开发效率与用户体验
React 中集成 Ant Design 组件库:提升开发效率与用户体验 一、为什么选择 Ant Design 组件库?二、基础引入方式三、按需引入(优化性能)四、Ant Design Charts无缝接入图标前面提到了利用Redux提供全局维护,但如果在开发时再自己手动封装组件,不仅效率不高,可能开发的组件…...
神经网络:节点、隐藏层与非线性学习
神经网络:节点、隐藏层与非线性学习 摘要: 神经网络是机器学习领域中一种强大的工具,能够通过复杂的结构学习数据中的非线性关系。本文从基础的线性模型出发,逐步深入探讨神经网络中节点和隐藏层的作用,以及它们如何…...
vue+tsc+noEmit导致打包报TS类型错误问题及解决方法
项目场景: 提示:这里简述项目相关背景: 当我们新建vue3项目,package.json文件会自动给我添加一些配置选项,这写选项基本没有问题,但是在实际操作过程中,当项目越来越复杂就会出现问题,本文给大家分享vuetscnoEmit导致打包报TS类型错误问题及…...
Ragflow服务器上部署教程
参考官方文档进行整理 克隆相应代码 git clone https://github.com/infiniflow/ragflow.git修改vm.max_map_count sudo sysctl -w vm.max_map_count262144修改 daemon.json文件 {"registry-mirrors": ["https://docker.m.daocloud.io","https://0…...
Ubuntu 系统中解决 Firefox 中文显示乱码的完整指南
Firefox 是一款流行的网络浏览器,但在 Ubuntu 系统中有时会遇到中文显示乱码的问题。本文将为您提供一个全面的解决方案,帮助您轻松解决这个烦人的问题。 问题概述 在 Ubuntu 系统中使用 Firefox 浏览器时,有时会发现中文字符显示为乱码或方块。这通常是由于缺少合适的中文…...
JVM——垃圾回收
垃圾回收 在Java虚拟机(JVM)的自动内存管理中,垃圾回收(Garbage Collection, GC)是其核心组件之一。它负责回收堆内存中不再使用的对象所占用的内存空间,以供新对象的分配使用。下面我们将深入探讨JVM中的…...
【AI News | 20250506】每日AI进展
AI Repos 1、gitsummarize GitSummarize是一个在线工具,用户只需将GitHub URL中的“hub”替换为“summarize”,即可为任何公开或私有代码库生成交互式文档。该工具利用Gemini分析代码结构,自动生成系统级架构概述、目录和文件摘要、自然语言…...
LabVIEW高冲击加速度校准系统
在国防科技领域,高 g 值加速度传感器广泛应用于先进兵器研制,如深侵彻系统、精确打击弹药及钻地弹药等。其性能指标直接影响研究结果的准确性与可靠性,因此对该传感器进行定期校准意义重大。高冲击加速度校准系统具备多方面功能,适…...
优化算法 - intro
优化问题 一般形式 minimize f ( x ) f(\mathbf{x}) f(x) subject to x ∈ C \mathbf{x} \in C x∈C 目标函数 f : R n → R f: \mathbb{R}^n \rightarrow \mathbb{R} f:Rn→R限制集合例子 C { x ∣ h 1 ( x ) 0 , . . . , h m ( x ) 0 , g 1 ( x ) ≤ 0 , . . . , g r …...
从PotPlayer到专业播放器—基于 RTSP|RTMP播放器功能、架构、工程能力的全面对比分析
从PotPlayer到专业播放器SDK:工程项目怎么选择合适的播放方案? ——基于 RTSP、RTMP 播放器功能、架构、工程能力的全面对比分析 在许多音视频项目早期,我们都听过这句话: “本地测试就用 PotPlayer 播吧,能播就行了…...
EasyRTC嵌入式音视频通信SDK技术,助力工业制造多场景实时监控与音视频通信
一、背景 在数字化时代,实时监控广泛应用于安防、工业、交通等领域。但传统监控系统实时性、交互性欠佳,难以满足需求。EasyRTC作为先进实时通信技术,具有低延迟、高可靠、跨平台特性,能有效升级监控系统。融入EasyRTC后…...
MPay码支付系统第四方聚合收款码多款支付插件个人免签支付源码TP8框架全开源
一、源码描述 这是一套码支付源码(MPay),基于TP8框架,前端layui2.9后端PearAdmin,专注于个人免签收款,通过个人的普通收款码,即可实现收款通知自动回调,支持绝大多数商城系统&#…...
wrod生成pdf。[特殊字符]改背景
import subprocess import os,time from rembg import remove, new_session from PIL import Image import io from docxtpl import DocxTemplate, InlineImage from docx.shared import Inches input_folder ‘tupian’ # 输入文件夹 kouchu_folder ‘kouchu’ # 去背景图像…...
动手学深度学习12.1. 编译器和解释器-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:无 本节教材地址:12.1. 编译器和解释器 — 动手学深度学习 2.0.0 documentation 本节…...
数字文明时代开源技术驱动的商业范式重构:基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同创新研究
摘要:数字文明时代,数字技术正以指数级速度重构全球经济与社会结构。本文聚焦开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同创新机制,从技术架构、商业逻辑、实践案例三个维度展开系统研究。基于多行业实证数据,揭示开源技…...
【Bootstrap V4系列】学习入门教程之 组件-轮播(Carousel)
Bootstrap V4系列 学习入门教程之 组件-轮播(Carousel) 轮播(Carousel)一、How it works二、Example2.1 Slides only 仅幻灯片2.2 With controls 带控制装置2.3 With indicators 带指示器2.4 With captions 带字幕 轮播࿰…...
嵌入式openharmony标准鸿蒙系统驱动开发基本原理与流程
第一:鸿蒙概述 OpenHarmony采用多内核(Linux内核或者LiteOS)设计,支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时,如何能够让设备驱动程序在不同内核间平滑迁移,消除驱动代码移植适配和维护的负担,是OpenHarmony驱动子系统需要解决的重要问题。 …...
Leetcode 刷题记录 08 —— 链表第二弹
本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答,01~07为C语言,08及以后为Java语言。 01 合并两个有序链表 /*** Definition…...
PaddlePaddle 和PyTorch选择与对比互斥
你遇到的错误信息如下: RuntimeError: (PreconditionNotMet) Tensors dimension is out of bound.Tensors dimension must be equal or less than the size of its memory.But received Tensors dimension is 8, memorys size is 0.[Hint: Expected numel() * Size…...
极新月报·2025.4人工智能投融资观察
“ AI投资从‘量’向‘质’过渡 ” 4月重点关注: 1、四月人工智能领域投融资事件105起,披露金额78.63亿人民币。 2、亿级人民币以上金额的投资事件共20起 。 3、四月人工智能领域出现1起IPO事件。 4、在所有融资事件里,除去股权投资&…...
C++ vector 介绍与使用
目录 1.vector是什么? 2.vector的使用 2.1vector的构造函数 2.2vector iterator 的使用 2.3vector 空间增长问题 2.4vector的增删查改 1.vector是什么? 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也 采用连续的存储…...
可以下载blender/fbx格式模型网站
glbxz.com glbxz.com可以下载blender/fbx格式模型。当然里面有免费的...
Vi/Vim 编辑器详细指南
Vi/Vim 编辑器详细指南 简介一、模式详解1. 命令模式(Normal Mode)2. 插入模式(Insert Mode)3. 可视模式(Visual Mode)4. 命令行模式(Ex Mode)二、核心操作1. 保存与退出2. 导航与移动3. 编辑与文本操作4. 搜索与替换三、高级技巧1. 多文件与窗口操作2. 宏录制3. 寄存器…...
LeetCode 热题 100 22. 括号生成
LeetCode 热题 100 | 22. 括号生成 大家好,今天我们来解决一道经典的算法题——括号生成。这道题在 LeetCode 上被标记为中等难度,要求生成所有可能的并且有效的括号组合。这是一道非常经典的回溯法题目,非常适合用来练习递归和回溯的技巧。…...
UE5 MetaHuman眼睛变黑
第5个材质MI_EyeOcclusion_Inst修改成透明即可...
【C语言】--指针超详解(一)
目录 一.内存和地址 1.1--内存 1.2--如何理解编址 二.指针变量和地址 2.1--取地址操作符(&) 2.2--指针变量和解引用操作符(*) 2.2.1--指针变量 2.2.2--如何理解指针类型 2.2.3--解引用操作符 2.3--指针变量的大小 三.指针变量类型的意义 3.1--从指针的解引用方…...
高频工业RFID读写器-三格电子
高频工业RFID读写器 型号:SG-HF40-485、SG-HF40-TCP 产品功能 高频工业读写器(RFID)产品用在自动化生产线,自动化分拣系统,零部件组装产线等情境下,在自动化节点的工位上部署RFID读写设备,通过与制品的交互…...
驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域绘制
一:概述 前面在介绍了显示模式设置(分辨率,刷新率)之后,本文继续分析下,显示区域的绘制,详细看看虚拟机的画面是如何由QXL显卡绘制出来的。 二:相关数据结构介绍 struct qxl_moni…...
6.5 行业特定应用:金融、医疗、制造等行业的定制化解决方案
金融、医疗和制造行业作为全球经济支柱,面临数据复杂性、实时性需求和严格合规性的共同挑战,同时各行业因业务特性衍生出独特需求。金融行业需应对市场波动、欺诈风险和多国法规,医疗行业聚焦精准诊断和患者数据隐私,制造业则强调…...
【Linux我做主】深入探讨从冯诺依曼体系到进程
从冯诺依曼体系到进程 从冯诺依曼体系到进程github地址1. 前言2. 计算机硬件2.1 冯诺依曼体系结构2.2 冯诺依曼模型的三大要点2.3 从QQ聊天认识:冯诺依曼体系下数据是如何流动的?发送方数据流动接收方数据流动 3. 计算机软件的根基——操作系统3.1 操作系…...
idea更换jdk版本操作
有时候我们有更换jdk版本的问题,自己电脑可能有多个版本,下面来介绍修改jdk版本修改修改什么地方 1 2 3 4 5 6 再修改pom即可,还有环境变量即可,希望有帮到大家!...