理解java进程和多线程

一、进程是什么,线程是什么?

(1)理解

进程是一个主体任务,线程是这个进程下的子任务,下图解释:

描述:一个餐厅好比一个进程,一个餐厅下面有多个职位的厨师,他们分别是不同进程,执行不同子任务,当然我们一个进程里面可以有多个线程。单核cpu情况下,不同的进程在不同的时间段去使用 CPU 资源。 如果是多核cpu可以在同一时间有多个餐厅,多个进程。

(2)单核cpu和多核cpu:

多核CPU并不代表多个CPU。

多核CPU指的是单个CPU芯片上集成了两个或多个独立的计算核心,这些核心可以同时执行不同的任务,从而提高处理器的性能,每个核心都拥有自己的执行单元,可以独立执行指令。

*(3)cpu调度进程过程 

 

二、进程间通信

进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存 在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备 隔离性 Isolation
但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进 行配合地达到应用的目的,如此,进程之间就需要有进行 信息交换 的需求。进程间通信的需求就应运 而生。

目前,主流操作系统提供的进程通信机制有如下:
1. 管道
2. 共享内存
3. 文件
4. 网络
5. 信号量
6. 信号

总结

看着是不是很复杂,进程之间通信就好比,各个餐厅之间通信,万一餐厅之间间隔很远呢?没错不只是你计算机处理这些进程之间通信也很复杂,那怎末办呢?这里我们引入了多线程,就好比原来是两家餐厅干的活儿集中在一家干了,这样是加重了厨师们的负担但是大大减轻了cpu创建进程消耗的资源。

三、多线程

 (1)"并发编程" 成为 "刚需".

  • 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
  • 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程

(2)虽然多进程也能实现 并发编程, 但是线程比进程更轻量.

  • 创建线程比创建进程更快.
  • 销毁线程比销毁进程更快.
  • 调度线程比调度进程更快

*(3)进程和线程之间关系

1、进程包含线程、一个进程可以有一个线程或多个线程

2、进程和线程、都是用来实现并发变成场景的,但是线程比进程更加轻量、高效。

3、同一进程的线程之间共用同一份资源(内存+硬盘),省去了申请资源的开销,所以轻量。

4、进程间不会相互影响,但是同一进程中的线程之间可能相互影响。

5、进程是资源分配的基本单位,线程是调度执行的基本单位。

四、创建多线程 

(1)创建一个单线程

class MyThread extends Thread{//一个线程@Overridepublic void run() {System.out.println("hello thread");//run方法只是描述线程执行的任务}
}
public class Main {public static void main(String[] args) {Thread t=new MyThread();t.start();//线程调用}
}

 

(2)多线程创建 

class MyThread extends Thread{//一个线程@Overridepublic void run() {while (true){System.out.println("hello thread");//run方法只是描述线程执行的任务try {Thread.sleep(1000);//sleep就是休息一下在执行,方便结果观察} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Main {public static void main(String[] args) throws InterruptedException {//这里main也是一个线程Thread t=new MyThread();t.start();//线程调用while (true){System.out.println("hello main");Thread.sleep(1000);}}
}

 

总结:我们发现线程是并发执行的,就是同时打印hello main 和 hello thread ,但是这两者打印顺序是随机的。 

 

(3)简化的多线程写法(lambda表达式)

public class Test1 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{while (true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}} });t.start();while (true){System.out.println("hello main");Thread.sleep(1000);}}
}

 

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

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

相关文章

Java代码基础算法练习-公式求和-2024.03.24

任务描述&#xff1a; 求公式Snaaaaaa…aa…aaa&#xff08;有n个a&#xff09;之值&#xff0c;其中a是一个数字&#xff0c;为2。 例如&#xff0c;n5 时222222222222222&#xff0c;n 由键盘输入(n<5)。 任务要求&#xff1a; package march0317_0331;import java.util.…

闭包学习,闭包和高阶函数

面试官反复在前端面试中提出闭包相关的问题&#xff0c;并要求提供代码示例&#xff0c;主要是为了考察以下几点&#xff1a; 1.概念&#xff1a;考察候选人是否真正理解闭包是如何形成的&#xff0c;即当一个函数可以访问并操作其外部作用域中的变量&#xff0c;即使在其外部…

React函数组件Hook

问题: 相对于类组件, 函数组件的编码更简单, 效率也更高, 但函数组件不能有state (旧版) 解决: React 16.8版本设计了一套新的语法来让函数组件也可以有state Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 Hook也叫钩子…

Simple negative sampling for link prediction inknowledge graphs

摘要 知识图嵌入方法学习知识图中实体和关系的低维向量表示&#xff0c;便于知识图中的链接预测任务。在学习嵌入过程中&#xff0c;采样负三元组是很重要的&#xff0c;因为KGs只观察到正三元组。据我们所知&#xff0c;均匀随机、基于生成对抗网络(GAN)和nscach、结构感知负…

Linux 系统 快速卸载docker

(卸载前一定要做好相关数据的备份) 卸载&#xff1a; 第一种卸载方法 1、查询docker安装过的包&#xff1a; yum list installed | grep docker 2、删除安装包&#xff1a; yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y 3、删除镜像/容器等 rm -rf /var/lib/dock…

【征稿进行时|见刊、检索快速稳定】2024年教育资源与人文发展国际学术会议(ICERHD 2024)

【征稿进行时|见刊、检索快速稳定】2024年教育资源与人文发展国际学术会议&#xff08;ICERHD 2024&#xff09; 2024 International Conference on Educational Resources and Humanistic Development&#xff08;ICERHD 2024&#xff09; 大会主题&#xff1a; 教育艺术 商…

机器学习周报第33周

目录 摘要Abstract一、文献阅读1.1 论文标题1.2 论文摘要1.3 论文背景1.4 过去研究1.5 论文介绍1.5.1 论文模型1.5.2 时空交互学习模块&#xff08;Spatiotemporal Interactive Learning Module&#xff09;1.5.3 动态图推理模块&#xff08;Dynamic Graph Inference Module&am…

【Java】基于SpringCloud的考研复试辅导平台

1、前端请求后端服务提供的接口。 2、后端服务的控制层Controller接收前端的请求。 3、Contorller层调用Service层进行业务处理。 4、Service层调用Dao持久层对数据持久化。 XXX-api&#xff1a;接口工程&#xff0c;为前端提供接口。 XXX-service: 业务工程&#xff0c;为…

SQLite使用的临时文件(二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite数据库文件损坏的可能几种情况 下一篇&#xff1a;未发表 ​ 1. 引言 SQLite的显着特点之一它是一个数据库由一个磁盘文件组成。 这简化了 SQLite 的使用&#xff0c;因为移动或备份 数据库就像复制单个文…

第4周 Python程序流程控制刷题(选择结构)

单击题目&#xff0c;直接跳转到页面刷题&#xff0c;一周后公布答案。 B2050&#xff1a;三角形判断B2037&#xff1a;奇偶数判断B2039&#xff1a;整数大小比较P5711&#xff1a;闰年判断P5714&#xff1a;肥胖问题B2043&#xff1a;判断能否被 3&#xff0c;5&#xff0c;7…

shell编程-jq命令详解

文章目录 前言一、jq简介1. 简介2. 语法3. 命令选项 二、用于处理json数据1. 过滤1.1 标识运算符1.2 基本过滤1.3 获取对象属性1.3 迭代数组元素1.4 获取数组元素1.5 使用运算符 2. 类型和值2.1 数组构造2.2 对象构造2.3 递归下降 3. 内置运算符和函数3.1 算术运算符3.2 函数3.…

PCL点云处理之最小中值平方(Lmeds法)拟合平面(二百三十四)

PCL点云处理之 最小中值平方法(Lmeds)拟合平面(二百三十四) 一、算法介绍一、拟合原理二、具体实现1.代码2.结果一、算法介绍 (本文提供详细注释,输出拟合平面参数和平面点云) Lmeds(Least Median of Squares)是一种统计学方法,用于拟合数据并减少异常值对拟合结果…

CISP证书如何查询?软考信息安全工程师和CISP哪个好?

在信息安全领域&#xff0c;证书是衡量一个人专业能力和经验的重要标志。 CISP(国家信息安全专业人员认证)和软考信息安全工程师证书都是业内认可度较高的证书。 那么&#xff0c;对于想要提升自己信息安全能力的人来说&#xff0c;究竟应该如何选择呢&#xff1f; 下面将为…

汽车信息安全--密钥管理系统初探(1)

目录 1.为什么需要密钥管理 2.常见密钥种类 3.小结 当真正开始思考如何设计基于HSM的密钥管理系统,才发现基于之前vHSM的套路是相当不完备的。 仅仅是依靠AUTOSAR KeyM和CSM提出的密钥管理要点作为需求,总觉得是无根之水,不够踏实。因此我打算从密钥的实际使用场景、HSM…

基础篇Redis

基础篇Redis 1.Redis简单介绍 Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key.value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串.数值.甚至json…

前端-html-01

1.HTML的标签分类 1.1常用排版标签 标签名语义和功能属性单标签还是双标签h1 ~ h6一级标题~六级标题无双标签p段落无双标签hr分隔线无单标签br换行无单标签pre原格式显示无双标签div无语义&#xff0c;用于页面布局无双标签 1.1.1h标题标签 <!DOCTYPE html> <htm…

【Node.js 常用命令(第一篇)】揭秘Node.js:掌握这些常用命令,让你在开发路上风生水起!

目录 前言 30条常用的Node.js 命令 1. node - 启动 Node.js REPL 或执行脚本 2. npm - Node.js 包管理器 3. npx - 执行 Node 包程序 4. nodemon - 自动重启 Node.js 应用 5. express - 快速搭建 Web 应用框架 6. git - 版本控制系统 7. mocha - 测试框架 8. eslint …

面试算法-104-乘积最大子数组

题目 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续 子数组 &#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 示例 1: 输入: nums [2,3,-2,4] 输出: 6 解释: 子数…

python ch8 函数

# 如何编写函数&#xff0c;以及如何传递实参&#xff0c;让函数能够访问完成其工作所需 # 的信息&#xff1b;如何使用位置实参和关键字实参&#xff0c;以及如何接受任意数量的实参&#xff1b;显示输出的函数和返 # 回值的函数&#xff1b;如何将函数同列表、字典、if语句…

Android_NDK调试

第一步&#xff1a; 链接log动态库 在Android.mk文件中添加 LOCAL_LDLIBS -llog 注意&#xff1a;一定要在 include $(BUILD_SHARED_LIBRARY) 之上添加&#xff0c;因为当执行到这句话的时候就表示所有的lib动态库已经加载完毕了&#xff0c;所以当你在这句代码之后再添加…