线程与进程基础
文章目录
- 前言
- 一、 线程与进程
- 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 什么是线程与进程?1.2 并发与并行1.3 同步调用与异步调用1.4 为什么要使用多线程? 前言 在学习juc前,需要先对进程和线程之间整体有一个认知。我们之前或多或少接触过,一些特别高大上的概念&…...
electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题
electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题 这篇文章是接我cocos专栏的上一篇文章继续写的,我上一篇文章写的是 cocos 开发触摸屏项目,需要嵌入一个网页用来展示,最后通过 electron 打包成 exe 程序,而且网页里面…...
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.脑图 定义一个数组,用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息,删除后调用显示学生信息函数 显示 4> 封…...
Debezium系列之:使用Debezium采集oceanbase数据库
Debezium系列之:使用Debezium采集oceanbase数据库 一、oceanbase数据库二、安装OceanBase三、安装oblogproxy四、基于Docker的简单采集案例五、生产实际应用案例Debezium 是一个开源的分布式平台,用于监控数据库变化和捕捉数据变动事件,并以事件流的形式导出到各种消费者。D…...
VMware虚拟机 Ubuntu没有共享文件夹的问题
在虚拟机的Ubuntu系统中,共享文件目录存放在 mnt/hgfs 下面,但是我安装完系统并添加共享文件后发现,在mnt下连/hgfs目录都没有。 注意:使用共享文件目录需要已安装VMtools工具。 添加共享文件目录 一:在超级用户下 可…...
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若依框架前端打包部署到服务器,需要部署到多个服务器上,每次打包会很麻烦,今天教大家一个动态配置请求头api的方法,部署后能动态获取(修改)对应服务器的请求ip 介绍两种方法,如有需要可以直接尝试步骤一ÿ…...
C语言关于溢出和不溢出的判断
通过实验来判断整数溢出,浮点数溢出的情况 #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 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加“使用 Microsoft Fabric 实现数据湖仓”活动,了解如何在 AI 的帮助下统一数据分析。了解如何简…...
Unreal的Audio::IAudioCaptureStream在Android中录制数据异常
修改OpenAudioCaptureStream启动参数为PCM_32,在PC上正常,在Android系统,读取的的数据计算出的音量值在0.4-0.6之间跳动,数据异常。 Audio::FAudioCaptureDeviceParams Params;/** 设置声卡不支持的采样数和通道数开始音频流不会成…...
6、AI测试辅助-测试报告编写(生成Bug分析柱状图)
AI测试辅助-测试报告编写(生成Bug分析柱状图) 一、测试报告1. 创建测试报告2. 报告补充优化2.1 Bug图表分析 3. 风险评估 总结 一、测试报告 测试报告内容应该包含: 1、测试结论 2、测试执行情况 3、测试bug结果分析 4、风险评估 5、改进措施…...
【第五节】docker应用系列篇: 使用Docker容器实现ElasticSearch+Kibana部署
系列文章目录 【第五节】docker应用系列篇: 使用Docker容器实现ElasticSearchKibana部署 系列文章目录前言一、 docker运行es二、 docker运行kibina 前言 配一次,真觉得方面 一、 docker运行es docker pull elasticsearch:7.17.0# mkdir -p /opt/es/co…...
openwrt 通过DHCP/DNS(Dnsmasq)屏蔽指定域名(hosts)
1、准备好hosts文件 2、登录openwrt后台:系统-TTYD终端-root登录: cd /etc ls vi hosts_by_me vi hosts_by_me 创建/打开 hosts_by_me文件,把准备好的hosts文件的内容复制粘贴进去,然后保存退出:wq cat hosts_by_me查看确认保…...
opencv——识别图片颜色并绘制轮廓
图像边缘检测 本实验要用到Canny算法,Canny边缘检测方法常被誉为边缘检测的最优方法。 首先,Canny算法的输入端应为图像的二值化结果,接收到二值化图像后,需要按照如下步骤进行: 高斯滤波。计算图像的梯度和方向。非极…...
docker简单私有仓库的创建
1:下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2:开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…...
etcd常见运维事件
1、etcd扩/缩容 参考:etcd节点扩/缩容-CSDN博客 2、etcd数据备份/恢复 数据备份 数据备份要从leader节点进行备份,否则可能存在数据同步延迟导致数据不一致; etcdctl --endpoints"https://10.119.48.166:2379" snapshot save /d…...
[代码随想录17]二叉树之最大二叉树、合并二叉树、二搜索树中的搜索、验证二叉搜索树。
前言 二叉树的题目还是要会一流程构造函数之类的。其中还有回溯的思想 题目链接 654. 最大二叉树 - 力扣(LeetCode) 一、最大二叉树 思路:还是考察构造二叉树,简单来说就是给你一个数组去构建一个二叉树,递归来解决就…...
前端三大框架 Vue、React 和 Angular 的市场占比分析
一、引言 ?? 随着前端技术的迅速发展,Vue.js、React 和 Angular 已成为全球最受欢迎的三大前端框架。在国内外,不同的框架在市场中的占比和流行程度存在显著差异。本文将从全球和中国市场的角度,对这三大框架的市场占比进行分析࿰…...
别再为ChatTTS声音飘忽发愁了!手把手教你用Python代码+高质量.pt音色文件,生成稳定语音
用Python和优质音色文件打造稳定语音合成体验 语音合成技术正在改变内容创作的方式,但很多开发者在实际使用ChatTTS时都会遇到一个共同的困扰——生成的语音音色飘忽不定,每次输出都像开盲盒。这种不稳定性严重影响了专业场景下的使用体验,比…...
Cadence Layout XL 飞线太乱?两步搞定,还你一个清爽的版图界面
Cadence Layout XL飞线管理实战:从视觉优化到高效布局 每次打开Cadence Layout XL,看到满屏密密麻麻的飞线,是不是感觉头都大了?作为一名从Altium转战Cadence的版图工程师,我完全理解这种视觉轰炸带来的困扰。飞线本是…...
如何用Mermaid Live Editor高效创建专业图表:从技术文档到项目管理的全流程指南
如何用Mermaid Live Editor高效创建专业图表:从技术文档到项目管理的全流程指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...
星思半导体系统级通信测试实验室设备齐全,为卫星通信芯片验证提供坚实保障
随着政府工作报告首次为卫星互联网“定调”,资本市场的聚光灯迅速转向这条黄金赛道。业内观察指出,2026年的市场关注点更加务实,聚焦于真正具备核心技术、能参与国际竞争的上游“硬科技”企业。在政策与资本的同频共振下,以星思半…...
告别手动输入:用快马ai自动化mathtype公式生成,效率提升300%
作为一名经常需要写技术文档的开发者,数学公式的输入一直是个头疼的问题。传统的方式要么是手动在Mathtype里点选符号,要么得记住各种LaTeX语法,效率实在太低。最近尝试用InsCode(快马)平台开发了一个自动化工具,终于解决了这个痛…...
2026最权威的十大降重复率神器实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于当下竞争极为激烈的商业环境之中,企业降本增效的需求变得越发迫切,…...
小说下载器终极指南:从零开始掌握多平台小说下载与本地化阅读
小说下载器终极指南:从零开始掌握多平台小说下载与本地化阅读 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader novel-downloader 是一款功能强大的浏览器脚本工具…...
抖音无水印视频下载全攻略:从技术突破到行业落地的实战指南
抖音无水印视频下载全攻略:从技术突破到行业落地的实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...
从Harness工程视角深度解读Claude Code源码,AI编码Agent的工业级实现逻辑
2026年3月底,Anthropic旗下命令行编码Agent工具Claude Code,因npm发布包中的source map文件意外暴露存储在官方R2存储桶内的未混淆源码,让外界首次得以窥见工业级AI Agent系统的真实架构。这份超过51万行TypeScript代码的工程样本,…...
百度网盘直链解析:告别龟速下载的Python利器
百度网盘直链解析:告别龟速下载的Python利器 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾面对百度网盘几十KB的下载速度感到无奈?当别人都在…...
