JUC并发编程——进程与线程

news/2024/4/25 21:24:45/文章来源:https://blog.csdn.net/m0_56188609/article/details/129132032

目录

    • 一、进程和线程的概念
      • 1.1 进程
      • 1.2 线程
      • 1.3 进程与线程对比
    • 二、并行和并发的概念
    • 三、线程基本应用
      • 3.1 多线程应用——异步调用

一、进程和线程的概念

1.1 进程

● 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的

● 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。(Windows下程序的外在形式为.exe的文件)

● 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)

1.2 线程

● 一个进程之内可以分为一到多个线程。

● 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行

● Java 中,线程作为最小调度单位进程作为资源分配的最小单位。 在 windows 中进程是不活动的,只是作为线程的容器

1.3 进程与线程对比

● 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集
● 进程拥有共享的资源,如内存空间等,供其内部的线程共享
● 进程间通信较为复杂
——同一台计算机的进程通信称为 IPC(Inter-process communication)
——不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP
● 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
● 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

二、并行和并发的概念

单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,会将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感
觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行 ,

一般会将这种 同一时刻线程轮流使用 CPU 的做法称为并发, concurrent
在这里插入图片描述

在这里插入图片描述

多核 cpu下,每个 核(core) 都可以调度运行线程,这时候线程可以是并行的。
在这里插入图片描述

在这里插入图片描述
引用 Rob Pike 的一段描述:
● 并发(concurrent)是同一时间应对(dealing with)多件事情的能力
● 并行(parallel)是同一时间动手做(doing)多件事情的能力

例子
● 家庭主妇做饭、打扫卫生、给孩子喂奶,她一个人轮流交替做这多件事,这时就是并发
● 家庭主妇雇了个保姆,她们一起做这些事,这时既有并发,也有并行(这时会产生竞争,例如锅只有一口,一个人用锅时,另一个人就得等待)

三、线程基本应用

3.1 多线程应用——异步调用

以调用方角度来讲,如果
● 需要等待结果返回,才能继续运行就是同步
● 不需要等待结果返回,就能继续运行就是异步
注意:同步在多线程中还有另一层意思,是让多个线程步调一致

* 应用之异步调用(案例1)

同步演示效果:必须等到方法调用完全结束方法返回后才能继续执行下面的代码(典型的同步调用
在这里插入图片描述

异步演示效果:(:读取操作执行的线程不同,读取操作开始结束都是由一个线程名称为Thread-0来执行的; :主线程并未等待Thread-0执行完)
在这里插入图片描述

1) 设计
多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停…而Java中如果希望方法的调用变为异步,只能使用多线程技术

2) 多线程针对异步操作的典型应用
: 比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程用来处理视频转换,避免阻塞主线程/调用者线程,进而提高用户体验度
: tomcat 的异步 servlet 也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞 tomcat 的工作线程,进而提高整个Tomcat服务器的吞吐量
: ui 程序中,开线程进行其他操作,避免阻塞 ui 线程

* 应用之提高效率(案例1)

充分利用多核 cpu 的优势,提高运行效率。想象下面的场景,执行 3 个计算,最后将计算结果汇总。
在这里插入图片描述
● 如果是串行执行,那么总共花费的时间是 10 + 11 + 9 + 1 = 31ms
● 但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间只取决于最长的那个线程运行的时间,即 11ms 最后加上汇总时间只会花费 12ms

注意:需要在多核 cpu 才能提高效率,单核仍然时是轮流执行

1)环境搭建

■ 基准测试工具选择,使用了比较靠谱的JMH(JMH执行测试时需要使用Maven将其打为jar包,运行jar包即可),它会执行程序预热,执行多次测试并平均

■cpu核数限制,有两种思路
—— 1.使用虚拟机,分配合适的核
—— 2.使用msconfig,分配合适的核,需要重启比较麻烦

■ 并行计算方式的选择

—— 1.最初想直接使用parallel stream,后来发现它有自己的问题
—— 2.改为了自己手动控制thread,实现简单的并行计算

■ 测试代码如下

mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jmh -
DarchetypeArtifactId=jmh-java-benchmark-archetype-DgroupId=org.sample-DartifactId=test -Dversion=1.0

比较单线程与多线程下对1亿个数求和的差异
在物理机(多核)运行

package com.itcast;import org.openjdk.jmh.annotations.*;import java.util.Arrays;
import java.util.concurrent.FutureTask;@Fork(1)
// 测试模式(选择统计程序最后执行的平均时间)
@BenchmarkMode(Mode.AverageTime)
// 热身次数(3次)
@Warmup(iterations=3)
// 进行5轮测试(最后获取平均值)
@Measurement(iterations=5)
public class MyBenchmark {// 对1亿个数进行求和;分析单/多线程下的差异static int[] ARRAY = new int[1000_000_00];static {Arrays.fill(ARRAY, 1);}@Benchmark// 4个线程,每个线程计算2.5千万个数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// 一个线程计算1亿个数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();}
}

在这里插入图片描述
可以观察到在多线程下性能得到了明显的提升

2) 结论

  1. 单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu ,不至于一个线程总占用 cpu,别的线程没法工作

  2. 多核 cpu 可以并行跑多个线程,但能否提高程序运行效率还是要分情况的
    ● 有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。但不是所有 计算任务都能拆分(参考后文的【阿姆达尔定律】)
    ● 也不是所有任务都需要拆分,任务的目的如果不同,谈拆分和效率没啥意义

  3. IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化

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

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

相关文章

【Mysql系列】Mysql之ACID实现原理

ACID 原子性 事务不可分割&#xff0c;要么全部执行&#xff0c;要么都不执行。原理是使用undo log。undo log&#xff0c;当事务对数据库进行修改的时候&#xff0c;会生成对应的undo log。 持久性 事务提交后&#xff0c;对于数据库的改变是永久性的。实现原理通过redo l…

超详细解读!数据库表分区技术全攻略

更多内容可以关注微信公众号&#xff1a;老程序员刘飞 分区的定义 分区是一种数据库优化技术&#xff0c;它可以将大表按照一定的规则分成多个小表&#xff0c;从而提高查询和维护的效率。在分区的过程中&#xff0c;数据库会将数据按照分区规则分配到不同的分区中&#xff0…

排序算法-java实现

文章目录冒泡排序选择排序插入排序快速排序希尔排序冒泡排序 原理&#xff1a; 依次比较两个相邻的元素&#xff0c;如果它们顺序错误就把它们交换过来。 时间复杂度&#xff1a; 若文件的初始状态是正序的&#xff0c;一趟扫描即可完成排序。所需的关键字比较次数C和记录移…

graphviz:实现图文件的可视化

1. graphviz下载安装 参考的是这篇文章&#xff1a;https://blog.csdn.net/qq_37085158/article/details/126421102 graphviz的下载地址为&#xff1a;https://graphviz.org/download/ 2. graphviz的使用步骤 将edge文件转化成dot文件WinR&#xff0c;输入cmd&#xff0c;在…

linux rsync服务端安装和windows客户端备份

安装&#xff1a;yum install -y rsync 密码内容&#xff1a;zhangsan:123456 配置文件&#xff1a;/etc/rsyncd.conf内容 # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: uid root gi…

LVGL Styles

LVGL StylesGet started按钮添加标签按钮添加风格滑动条值显示StylesSize stylesBackground stylesBorder stylesOutline stylesShadow stylesImage stylesArc stylesText stylesLine stylesGet started 按钮添加标签 /*** brief 按钮事件回调函数* param e */ void btn_eve…

网络有线无线配置

一、需求 在无线接入区内&#xff0c;当Lsw1的上联口出现故障时&#xff0c;需要通过AP1-LSw1-LSw2-LSw3的路径访问公网server3。这是因为AP1通过无线网连接到LSw1&#xff0c;而LSw1与LSw3之间的链路出现故障&#xff0c;无法直接访问公网server3。因此&#xff0c;流量需要通…

一文说清WMS系统与MES系统,SRM系统,ERP系统集成的好处

由于制造过程的多样性、复杂性、业务流程的多样性和复杂性&#xff0c;因此&#xff0c;制造企业的信息化系统包括WMS、SRM、MES等管理系统&#xff0c;但它们的管理方向却各不相同&#xff0c;例如WMS这个是管理仓库、 SRM是管理公司的供应商、 MES是管理车间的生产制造的等等…

决策树、随机森林、GBDT、XGBoost

文章目录 1. 引入 1.1 决策树1.2 随机森林1.3 GBDT(Gradient Boosting Decision Tree)梯度提升决策树1.4 XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;极端梯度提升2. 代码实现 2.1 决策树&随机森林&GBDT&XGBoost 2.1.1 分类2.1.2 回归2.1.3 显示模…

SpringCloud(二)配置中心

配置中心Nacos配置中心多环境共享Nacos集群搭建Nacos配置中心 作用&#xff1a; 统一配置管理配置自动刷新&#xff0c;热更新 实现&#xff1a; 统一配置管理 在nacos服务端&#xff0c;配置管理配置列表中新建配置了解配置获取的步骤&#xff1a; 项目启动->读取nacos中…

全开源无加密的RuleApp文章社区APP客户端源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 开源无加密的文章社区客户端源码分享 RuleApp文章社区&#xff0c;VIP会员&#xff0c;写作投稿积分商城&#xff0c;付费模块集成&#xff0c;多平台兼容这是一款开源免费&#xff0c;界…

最全es6数组方法

1.arr.push()从后面添加元素,返回值为添加完后的数组的长度 let arr [1,2,3,4,5] console.log(arr.push(5)) // 6 console.log(arr) // [1,2,3,4,5,5]2.arr.pop()从后面删除元素,只能是一个&#xff0c;返回值是删除的元素 let arr [1,2,3,4,5] console.log(arr.pop())//5 …

【Kubernetes 企业项目实战】08、简化 K8s 应用部署工具 Helm V3 入门到企业实战

目录 一、Helm 介绍 1.1 Helm 是什么 1.2 Helm 解决了什么痛点 1.3 Helm 相关组件及概念 1.4 Helm v3 版本变化 1.5 总结 二、安装 Helm 2.1 下载 Helm 2.2 安装 Helm 2.3 配置国内存放 chart 仓库的地址 三、Helm 基本使用 3.1 搜索和下载 Chart 3.2 部署 chart …

Tencent OS下逻辑卷(LVM)创建和扩容

测试环境是一个虚拟机&#xff0c;原配置1个虚拟盘。 创建4个虚拟盘&#xff0c;每盘2G并挂载在虚拟主机上&#xff0c;启动虚拟主机开始测试。 LVM英文是Logical Volume Manager&#xff0c;直接翻译为逻辑卷管理。 这种磁盘管理模式比较灵活&#xff0c;在磁盘空间不足的时…

WSO2通过设定Role来订阅对应的Api

WSO2通过设定Role来订阅对应的Api1. Add Role And User1.0 Add Role1.1 Add User 1.2 Add Mapping2. Upload Api2.1 Upload Three Apis2.2 Inspection3. AwakeningWSO2安装使用的全过程详解: https://blog.csdn.net/weixin_43916074/article/details/127987099. 1. Add Role An…

UnRaid虚拟机安装OpenWrt软路由

文章目录0、前言1、Openwrt虚拟机安装1.1、前提&#xff0c;需要先在UnRaid中开启虚拟机&#xff1a;1.2、下载OpenWrt虚拟机镜像并上传至UnRaid共享文件夹1.3、创建OpenWrt虚拟机2、开启并设置OpenWrt虚拟机2.1、修改OpenWrt管理ip2.2、OpenWrt的上网设置0、前言 最近折腾了很…

产品未出 百度朋友圈“开演”

ChatGPT这股AI龙卷风刮到国内时&#xff0c;人们齐刷刷望向百度&#xff0c;这家在国内对AI投入最高的公司最终出手了&#xff0c;大模型新项目文心一言&#xff08;ERNIE Bot&#xff09;将在3月正式亮相&#xff0c;对标微软投资的ChatGPT。 文心一言产品未出&#xff0c;百…

江南爱窗帘十大品牌 | 窗帘的定做有哪些技巧和注意事项?

人们的家居空间中总是会有各式各样的窗帘存在的&#xff0c;为了使得窗帘的品质更加的过关&#xff0c;人们在选购时&#xff0c;总是会希望可以购买到高品质的。一般情况下&#xff0c;会采用定制这种方法去进行制作。那么&#xff0c;窗帘的定做有哪些注意事项?窗帘定制技巧…

公司技术团队为什么选择使用 YApi 作为 Api 管理平台?

在 2021 年 12 月份的时候我就推荐过一款软件程序员软件推荐&#xff1a;Apifox&#xff0c;当时体验了一下里面的功能确实很实用&#xff0c;但是当时公司有一套自己的 API 管理方案&#xff0c;所有 Apifox 暂时就没在内部使用。 直到最近要使用其他的 API 管理方案的时候才…

el-form表单初始化赋值表单dataForm,,校验有问题,校验必填的也校验成功了

大家好啊,今天写表单发现我直接赋值对象 导致初始化校验必填校验成功以及validator校验有误的问题我的其企业名称 在初始化的时候 竟然都校验了 并且看起来像校验成功我在点击下一步的时候validator的时候&#xff0c;竟然也是校验成功&#xff0c;也不提示必填的错误最后检查我…