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

线程与进程基础

文章目录

  • 前言
  • 一、 线程与进程
    • 1.1 什么是线程与进程?
    • 1.2 并发与并行
    • 1.3 同步调用与异步调用
    • 1.4 为什么要使用多线程?

前言


在学习juc前,需要先对进程和线程之间整体有一个认知。我们之前或多或少接触过,一些特别高大上的概念,比如多线程,高并发 之类的。该文就是先对这些概念整体理清,为后续学习扫清障碍。


一、 线程与进程

1.1 什么是线程与进程?

进程

  • 进程是用来存放数据与指令等运行程序的组成部分,然后指令运行的时候还需用到磁盘、IO设备,网络等,其中进程就是用来加载指令,管理内存·,管理IO的。

  • 程序运行的时候,从磁盘 -> 内存就代表一个进程开启了

  • 进程可以看作一个程序的示例,比如我们打开任务管理器:

在这里插入图片描述

这表明,对于应用来说,可以运行一个或者多个进程。

线程

  • 一个进程包括多个线程
  • 一个线程就是一个指令流,将指令流的一条条指令以一定顺序交给CPU执行
  • Java中,线程是最小的调度单位,进程作为资源分配的最小单位。windows中,进程不活动,只是作为线程的容器。

二者对比 :

  • 进程拥有共享的资源,比如内存空间的,供子集线程共享
  • 进程间的通信较为复杂
    • 同一台计算机的进程通信称为IPC,比如套接字、消息队列等。
    • 不同计算机的通信要通过网路,并遵守共同的协议,比如http等。
  • 线程通信比较简单,因为它们可以共享进程内的内存,一个例子是多个线程访问一个共享变量。
  • 线程更轻量级,上下文切换成本较低。

1.2 并发与并行


  • 并发:两个及两个以上的任务在同一时间段执行
  • 并行:两个及两个以上的任务在同一时刻执行

并发

​ 在单核cpu中,线程实际是串行执行的。操作系统中的组件,叫做任务调度器,将cpu的时间片(windows下接近15ms)分给不同的线程使用,只是由于cpu在线程间的切换非常快,导致体感上是同时运行的

​ 总结一句话:微观串行,宏观并行,但是,实际上还是串行。

并行

​ 在多核cpu中,每个核心可以处理一个线程,这样就可以真正意义上实现并行,即同一时刻,同时运行多个线程。

如图:

在这里插入图片描述

在这里插入图片描述

1.3 同步调用与异步调用

注意
代码中的Constants.MP4_FULL_PATH就理解为一个文件即可。

该代码作用就是花时间读取一个文件。

  • 同步调用

在这里插入图片描述

  • 异步调用

在这里插入图片描述

从运行结果,可以看出来,异步调用是通过一个Thread-0的线程执行的。

从上面的运行结果可以得到两者的含义。


同步调用:发出一个调用之后,结果没有返回的话,该调用就不可以返回,一直等待。

异步调用:调用在发出后,不用等待返回结果,调用直接返回。


其实简单来说:
异步调用就是在main线程里面新开一个线程,并且新开的线程执行与否对于主线程接下来往下执行没有影响。
同步调用就是一直只执行当前线程呗,不开其它的线程。

根据这个,我们就可以引出下面的多线程:

  • 多线程的作用

​ 多线程可以让方法执行变成异步的(即不要干等着)。比如读取磁盘文件时,需要5秒,那如果我们不使用多线程,这5秒什么都做不了只能干等着。

1.4 为什么要使用多线程?

  • 在单核时代,使用多线程可以提高cpu和io系统的运行效率,如果只运行了一个java进程的情况下,当线程进行读取io的操作,此时线程被阻塞。如果没有多线程,那么此时整个进程都被阻塞, 无法使用cpu,系统整体效率只有50%。但是如果使用多线程的话,一个线程阻塞,其它线程还可以继续访问,大大提高系统运行效率。但是需要理解的是,单核中,多线程并不起到减少时间的作用。(单核只作了解)

  • 在多核时代。多线程主要是为了提高进程利用多核cpu的能力。

eg : 处理一个复杂的任务,如果只有一个线程,那么只有一个核心被利用到。失去了多核的作用,但是多个线程就可以同时使用多个核心同时处理任务,提高了解决任务的效率,时间约等于(单核时执行的时间 / cpu核心数)。

实例:

@Benchmark
public int c() throws Exception {int[] array = ARRAY;FutureTask<Integer> t1 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[0+i];}return sum;});FutureTask<Integer> t2 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[250_000_00+i];}return sum;});FutureTask<Integer> t3 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[500_000_00+i];}return sum;});FutureTask<Integer> t4 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 250_000_00;i++) {sum += array[750_000_00+i];}return sum;});new Thread(t1).start();new Thread(t2).start();new Thread(t3).start();new Thread(t4).start();return t1.get() + t2.get() + t3.get()+ t4.get();
}
@Benchmark
public int d() throws Exception {int[] array = ARRAY;FutureTask<Integer> t1 = new FutureTask<>(()->{int sum = 0;for(int i = 0; i < 1000_000_00;i++) {sum += array[0+i];}return sum;});new Thread(t1).start();return t1.get();
}

运行结果:

在这里插入图片描述

上述代码含义就是 :

4个线程(t1、t2、t3、t4),每个线程调用方法执行2500万次,打印信息中是c开头的。
d开头方法是一个方法调用1亿次。

c为异步调用,d为同步调用,从结果来看,c方法的效率显著高于d方法(Score越小,效率越高)。

但是如果是在单核cpu中的话,不会出现性能的提升,因为单核的本质上还是串行,并不会产生并行的效果。

相关文章:

线程与进程基础

文章目录 前言一、 线程与进程1.1 什么是线程与进程&#xff1f;1.2 并发与并行1.3 同步调用与异步调用1.4 为什么要使用多线程&#xff1f; 前言 在学习juc前&#xff0c;需要先对进程和线程之间整体有一个认知。我们之前或多或少接触过&#xff0c;一些特别高大上的概念&…...

electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题

electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题 这篇文章是接我cocos专栏的上一篇文章继续写的&#xff0c;我上一篇文章写的是 cocos 开发触摸屏项目&#xff0c;需要嵌入一个网页用来展示&#xff0c;最后通过 electron 打包成 exe 程序&#xff0c;而且网页里面…...

OpenCV的简单练习

1、读取一张彩色图像并将其转换为灰度图。 import matplotlib.pyplot as pltimg plt.imread("./flower.png") # 灰度化 img_gray img[:,:,0]*0.299 img[:,:,1]*0.587 img[:,:,2]*0.114plt.subplot(121) plt.imshow(img) plt.subplot(122) plt.imshow(img_gray,c…...

JAVA:建造者模式(Builder Pattern)的技术指南

1、简述 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造过程与表示分离,使得相同的构造过程可以创建不同的表示。建造者模式尤其适用于创建复杂对象的场景。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 本文将详细介绍建…...

12.11函数 结构体 多文件编译

1.脑图 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学生信息函数 显示 4> 封…...

Debezium系列之:使用Debezium采集oceanbase数据库

Debezium系列之:使用Debezium采集oceanbase数据库 一、oceanbase数据库二、安装OceanBase三、安装oblogproxy四、基于Docker的简单采集案例五、生产实际应用案例Debezium 是一个开源的分布式平台,用于监控数据库变化和捕捉数据变动事件,并以事件流的形式导出到各种消费者。D…...

VMware虚拟机 Ubuntu没有共享文件夹的问题

在虚拟机的Ubuntu系统中&#xff0c;共享文件目录存放在 mnt/hgfs 下面&#xff0c;但是我安装完系统并添加共享文件后发现&#xff0c;在mnt下连/hgfs目录都没有。 注意&#xff1a;使用共享文件目录需要已安装VMtools工具。 添加共享文件目录 一&#xff1a;在超级用户下 可…...

spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用

##spring rabbitmq代码示例 Controller代码 import com.alibaba.fastjson.JSONObject; import com.newland.mi.config.RabbitDMMQConfig; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; import org.springframewo…...

简单vue3前端打包部署到服务器,动态配置http请求头后端ip方法教程

vue3若依框架前端打包部署到服务器&#xff0c;需要部署到多个服务器上&#xff0c;每次打包会很麻烦&#xff0c;今天教大家一个动态配置请求头api的方法&#xff0c;部署后能动态获取(修改)对应服务器的请求ip 介绍两种方法&#xff0c;如有需要可以直接尝试步骤一&#xff…...

C语言关于溢出和不溢出的判断

通过实验来判断整数溢出&#xff0c;浮点数溢出的情况 #include <stdio.h> #include <limits.h> #include <float.h> int main(void) { // 整数溢出 int int_max INT_MAX; // INT_MAX 是 int 类型的最大值 int int_min INT_MIN; // INT_MIN …...

活动预告 |【Part1】Microsoft Azure 在线技术公开课:使用 Microsoft Fabric 实现数据湖仓

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加“使用 Microsoft Fabric 实现数据湖仓”活动&#xff0c;了解如何在 AI 的帮助下统一数据分析。了解如何简…...

Unreal的Audio::IAudioCaptureStream在Android中录制数据异常

修改OpenAudioCaptureStream启动参数为PCM_32&#xff0c;在PC上正常&#xff0c;在Android系统&#xff0c;读取的的数据计算出的音量值在0.4-0.6之间跳动&#xff0c;数据异常。 Audio::FAudioCaptureDeviceParams Params;/** 设置声卡不支持的采样数和通道数开始音频流不会成…...

6、AI测试辅助-测试报告编写(生成Bug分析柱状图)

AI测试辅助-测试报告编写&#xff08;生成Bug分析柱状图&#xff09; 一、测试报告1. 创建测试报告2. 报告补充优化2.1 Bug图表分析 3. 风险评估 总结 一、测试报告 测试报告内容应该包含&#xff1a; 1、测试结论 2、测试执行情况 3、测试bug结果分析 4、风险评估 5、改进措施…...

【第五节】docker应用系列篇: 使用Docker容器实现ElasticSearch+Kibana部署

系列文章目录 【第五节】docker应用系列篇&#xff1a; 使用Docker容器实现ElasticSearchKibana部署 系列文章目录前言一、 docker运行es二、 docker运行kibina 前言 配一次&#xff0c;真觉得方面 一、 docker运行es docker pull elasticsearch:7.17.0# mkdir -p /opt/es/co…...

openwrt 通过DHCP/DNS(Dnsmasq)屏蔽指定域名(hosts)

1、准备好hosts文件 2、登录openwrt后台&#xff1a;系统-TTYD终端-root登录&#xff1a; cd /etc ls vi hosts_by_me vi hosts_by_me 创建/打开 hosts_by_me文件&#xff0c;把准备好的hosts文件的内容复制粘贴进去&#xff0c;然后保存退出:wq cat hosts_by_me查看确认保…...

opencv——识别图片颜色并绘制轮廓

图像边缘检测 本实验要用到Canny算法&#xff0c;Canny边缘检测方法常被誉为边缘检测的最优方法。 首先&#xff0c;Canny算法的输入端应为图像的二值化结果&#xff0c;接收到二值化图像后&#xff0c;需要按照如下步骤进行&#xff1a; 高斯滤波。计算图像的梯度和方向。非极…...

docker简单私有仓库的创建

1&#xff1a;下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2&#xff1a;开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…...

etcd常见运维事件

1、etcd扩/缩容 参考&#xff1a;etcd节点扩/缩容-CSDN博客 2、etcd数据备份/恢复 数据备份 数据备份要从leader节点进行备份&#xff0c;否则可能存在数据同步延迟导致数据不一致&#xff1b; etcdctl --endpoints"https://10.119.48.166:2379" snapshot save /d…...

[代码随想录17]二叉树之最大二叉树、合并二叉树、二搜索树中的搜索、验证二叉搜索树。

前言 二叉树的题目还是要会一流程构造函数之类的。其中还有回溯的思想 题目链接 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 一、最大二叉树 思路&#xff1a;还是考察构造二叉树&#xff0c;简单来说就是给你一个数组去构建一个二叉树&#xff0c;递归来解决就…...

前端三大框架 Vue、React 和 Angular 的市场占比分析

一、引言 ?? 随着前端技术的迅速发展&#xff0c;Vue.js、React 和 Angular 已成为全球最受欢迎的三大前端框架。在国内外&#xff0c;不同的框架在市场中的占比和流行程度存在显著差异。本文将从全球和中国市场的角度&#xff0c;对这三大框架的市场占比进行分析&#xff0…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...