Javaee 多线程 --进程和线程之间的区别和联系

文章目录

  • 进程和线程
    • 进程
    • 线程
    • 进程和线程的区别
  • 创建线程的五种写法
    • 继承Thread,重写run
    • 实现Runnable(接口),重写run
    • 继承Thread,重写run,但是使用匿名内部类
    • 实现Runnable(接口),重写run,但是使用匿名内部类
    • 使用lambda表达式
  • 请说明Thread类中run和start的区别

在这里插入图片描述

进程和线程

进程

  1. 进程:是正在执行的程序,是资源分配的基本单位,具有独立的地址空间
  2. 操作系统会为其分配CPU和内存

线程

  1. 线程:引入线程是为了解决进程开销大,浪费资源的情景,并且多进程并发效率比较低
  2. 线程是调度执行的基本单位
  3. 线程之间会相互影响,一个线程挂了,会影响到整个进程都异常结束,线程也自然会结束

进程和线程的区别

  1. 进程包含线程,一个进程里面有多个线程或者是一个线程
  2. 进程和线程都是用来实现并发编程场景的,但是线程比进程更轻量和高效
  3. 同一个进程的线程之间共用同一份资源(内存和硬盘),省去了申请资源的开销
  4. 进程和进程之间都是独立存在的,不会相互影响,同一个进程中,线程和线程之间会相互影响(线程安全问题 + 线程出现异常)
  5. 进程是分配资源的基本单位,线程是调度执行的基本单位

创建线程的五种写法

继承Thread,重写run

package Thread;class MyThread extends Thread{public void run(){// 这个是线程的入口方法while(true) {System.out.println("hello Thread!");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}// 创建线程
public class Demo1 {public static void main(String[] args) throws InterruptedException {Thread thread = new MyThread();// 使用start方法可以间接调用run方法// start和 run都时Thread的成员// run 只是线程的入口(描述了线程要做什么事情)// start才是真正调用了系统的API,在系统中创建出了线程,让线程调用 runthread.start();// 从这句开始程序就并发执行,一边执行hello main,一边执行hello Thread// 兵分两路进行执行// 并发 == 并行 + 并发while(true){System.out.println("hello main!");Thread.sleep(1000);}// 先执行main,再执行的是Thread,先执行主线程}
}

实现Runnable(接口),重写run

package Thread;class MyRunable implements Runnable{public void run(){while(true){System.out.println("hello thread!");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Demo2 {public static void main(String[] args) throws InterruptedException {// 这个接口就是用来实现多态的Runnable myRunable = new MyRunable();Thread thread = new Thread(myRunable);thread.start();while(true){System.out.println("hello main!");Thread.sleep(1000);}}
}

继承Thread,重写run,但是使用匿名内部类

  1. 使用匿名内部类的方式创建出线程
package Thread;public class Demo3 {public static void main(String[] args) {Thread thread = new Thread(){public 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);}}}
}

实现Runnable(接口),重写run,但是使用匿名内部类

package Thread;public class Demo4 {public static void main(String[] args) {// 法一:创建实例Runnable runnable = new Runnable(){public void run(){System.out.println("hello Thread!");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}};// 法二:创建匿名对象Thread thread = new Thread(new Runnable(){public void run(){System.out.println("hello Thread!");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});// Thread thread = new Thread(runnable);thread.start();while(true){System.out.println("hello main!");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

使用lambda表达式

  1. lambda表达式相当于是匿名内部类的替换写法
package Thread;public class Demo5 {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);}}}
}

请说明Thread类中run和start的区别

  1. 从方法的区别,及运行结果的区别分别说明
    1. start方法可以用来启动一个新的线程,run方法只是一个普通的方法,在主线程中执行
    2.start方法只能调用一次,run方法可以调用多次
    3.调用start方法会执行新的线程,新线程和主线程并发执行,run方法只是线程的入口,start方法调用了系统API,start方法创建出了线程,让线程再调用run方法
    4.run方法和主线程同步执行,start方法启动的线程和主线程异步执行
    5.run方法按顺序执行,start方法调用的线程中的代码执行顺序由线程调度器决定,顺序不确定

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

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

相关文章

企业如何让内部视频仅限指定域名播放,确保视频不被泄露?

在数字化办公时代,企业内部的培训视频、产品演示或机密会议录像等敏感内容,一旦被非法传播或泄露,可能带来严重的商业风险。如何确保这些视频只能在公司官网或指定域名播放,防止被恶意下载、盗链或二次传播?今天介绍一…

端口映射原理操作详解教程:实现外网访问内网服务,本地路由器端口映射公网ip和软件端口映射域名2种方法

端口映射作为一种不同网络间通信的关键网络技术,在远程访问和内外网连接服务需求日益增长的如今,理解端口映射的原理和设置方法是确保网络服务可用性的必要技能。本文将深入探讨端口映射的基本概念、路由器端口映射设置步骤以及无公网IP用端口映射软件映…

【PyTorch】多对象分割项目

对象分割任务的目标是找到图像中目标对象的边界。实际应用例如自动驾驶汽车和医学成像分析。这里将使用PyTorch开发一个深度学习模型来完成多对象分割任务。多对象分割的主要目标是自动勾勒出图像中多个目标对象的边界。 对象的边界通常由与图像大小相同的分割掩码定义&#xf…

SSH 使用密钥登录服务器

用这种方法远程登陆服务器的时候无需手动输入密码 具体步骤 客户端通过 ssh-keygen 生成公钥和私钥 ssh-keygen -t rsa 生成的时候会有一系列问题,根据自己的需要选择就行。生成的结果为两个文件: 上传公钥至服务器,上述两个文件一般在客户…

MySQL 8.4 企业版启用TDE功能和表加密

一、系统环境操作系统:Ubuntu 24.04 数据库:8.4.4-commercial for Linux on x86_64 (MySQL Enterprise Server - Commercial)二、安装TDE组件前提:检查组件文件是否存在ls /usr/lib/mysql/plugin/component_keyring_encrypted_file.so1.配置全局清单文件…

【Altium designer】导出的原理图PDF乱码异常的解决方法

一、有些电源名字无法显示或器件丢失 解决办法 (1)首先AD18以及以上的新版本AD不存在该问题。 (2)其次AD17以及更旧版本的AD很可能遇到该问题,参考如下博客笔记进行操作即可: 大致的操作如下:DXP → Preferences → Schematic → Options里面“Render Text with GDI+”…

4.Ansible自动化之-部署文件到主机

4 - 部署文件到受管主机 实验环境 先通过以下命令搭建基础环境(创建工作目录、配置 Ansible 环境和主机清单): # 在控制节点(controller)上创建web目录并进入,作为工作目录 [bqcontroller ~]$ mkdir web &a…

Vuex的使用

Vuex 超详细使用教程(从入门到精通)一、Vuex 是什么?Vuex 是专门为 Vue.js 设计的状态管理库,它采用集中式存储管理应用的所有组件的状态。简单来说,Vuex 就是一个"全局变量仓库",所有组件都可以…

pytorch 数据预处理,加载,训练,可视化流程

流程定义自定义数据集类定义训练和验证的数据增强定义模型、损失函数和优化器训练循环,包括验证训练可视化整个流程模型评估高级功能扩展混合精度训练​分布式训练​{:width“50%” height“50%”} 定义自定义数据集类 # #1. 自定义数据集类 # class CustomImageD…

Prompt工程:OCR+LLM文档处理的精准制导系统

在PDF OCR与大模型结合的实际应用中,很多团队会发现一个现象:同样的OCR文本,不同的Prompt设计会产生截然不同的提取效果。有时候准确率能达到95%,有时候却只有60%。这背后的关键就在于Prompt工程的精细化程度。 🎯 为什…

RecSys:粗排模型和精排特征体系

粗排 在推荐系统链路中,排序阶段至关重要,通常分为召回、粗排和精排三个环节。粗排作为精排前的预处理阶段,需要在效果和性能之间取得平衡。 双塔模型 后期融合:把用户、物品特征分别输入不同的神经网络,不对用户、…

spring声明式事务,finally 中return对事务回滚的影响

finally 块中使用 return 是一个常见的编程错误,它会: 跳过正常的事务提交流程。吞掉异常,使错误处理失效 导致不可预测的事务行为Java 中 finally 和 return 的执行机制:1. finally 块的基本特性 在 Java 中,finally …

WPF 打印报告图片大小的自适应(含完整示例与详解)

目标:在 FlowDocument 报告里,根据 1~6 张图片的数量, 自动选择 2 行 3 列 的最佳布局;在只有 1、2、4 张时保持“占满感”,打印清晰且不变形。规则一览:1 张 → 占满 23(大图居中)…

【AI大模型前沿】百度飞桨PaddleOCR 3.0开源发布,支持多语言、手写体识别,赋能智能文档处理

系列篇章💥 No.文章1【AI大模型前沿】深度剖析瑞智病理大模型 RuiPath:如何革新癌症病理诊断技术2【AI大模型前沿】清华大学 CLAMP-3:多模态技术引领音乐检索新潮流3【AI大模型前沿】浙大携手阿里推出HealthGPT:医学视觉语言大模…

迅为RK3588开发板Android12 制作使用系统签名

在 Android 源码 build/make/target/product/security/下存放着签名文件,如下所示:将北京迅为提供的 keytool 工具拷贝到 ubuntu 中,然后将 Android11 或 Android12 源码build/make/target/product/security/下的 platform.pk8 platform.x509…

Day08 Go语言学习

1.安装Go和Goland 2.新建demo项目实践语法并使用git实践版本控制操作 2.1 Goland配置 路径**:** GOPATH workspace GOROOT golang 文件夹: bin 编译后的可执行文件 pkg 编译后的包文件 src 源文件 遇到问题1:运行 ‘go build awesomeProject…

Linux-文件创建拷贝删除剪切

文章目录Linux文件相关命令ls通配符含义touch 创建文件命令示例cp 拷贝文件rm 删除文件mv剪切文件Linux文件相关命令 ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的dir命令。 Linux文件或者目…

RabbitMQ:交换机(Exchange)

目录一、概述二、Direct Exchange (直连型交换机)三、Fanout Exchange(扇型交换机)四、Topic Exchange(主题交换机)五、Header Exchange(头交换机)六、Default Exchange(…

【实时Linux实战系列】基于实时Linux的物联网系统设计

随着物联网(IoT)技术的飞速发展,越来越多的设备被连接到互联网,形成了一个庞大而复杂的网络。这些设备从简单的传感器到复杂的工业控制系统,都在实时地产生和交换数据。实时Linux作为一种强大的操作系统,为…

第五天~提取Arxml中描述信息New_CanCluster--Expert

🔍 ARXML描述信息提取:挖掘汽车电子设计的"知识宝藏" 在AUTOSAR工程中,描述信息如同埋藏在ARXML文件中的金矿,而New_CanCluster--Expert正是打开这座宝藏的密钥。本文将带您深度探索ARXML描述信息的提取艺术,解锁汽车电子设计的核心知识资产! 💎 为什么描述…