谈谈JAVA中的同步和异步编码模型
#头条创作挑战赛#前言
在计算机的早期阶段,单处理器系统占据主导地位,许多早期的编程语言都采用了同步编程模型。但是随着硬件的进步,出现了多核的处理器,这就需要开发更好的编程模型。一个能够充分利用所有资源的强大模型将是最合适的模型,这也催生了异步编程模型。
对于初学者来说,很难理解这两种编程模型之间的区别。在这篇文章中,我将尝试用通俗易懂的术语来简化和解释差异。我们还将看一下 Java 中的一个简单示例,了解 Java 中为异步编程提供的 API。真实世界类比
在深入研究编程模型之前,我们先通过现实中的例子了解下同步和异步系统。超市作为一个同步系统
我们都去过超市商店购买我们的日常用品,每个人都用手推车收集物品,然后去柜台,柜台人员会扫描所有物品,准备账单,接受该人的付款,最后给出收据。对于每个客户来说,这部分都是一个耗时的过程。此外,所花费的时间与商品数量、任何技术故障和找零钱(现金支付)的时间成正比。
想象一下,如果是节假日,超市打折会怎么样? 客户将不得不排队,花费大量时间,就像下面的图片一样:
在同步系统中,需要等待前一个任务完成,才能处理下一个任务,这会导致系统的瓶颈并降低系统的吞吐量。麦当劳作为一个异步系统
麦当劳设有自助服务亭终端,客户可以下订单并完成付款。付款完成后,将随订单号一起分发收据。订单准备就绪后,屏幕上会显示订单号。
在准备食物的同时,顾客可以同时做多件事。他们不会被准备订单的人挡住,因此商店可以避免拥挤。客户不会按顺序收到他们的订单。例如: 一个人可能会在另一个人之前收到他的食物,即使他会在他之后下订单。这是异步系统的一个例子。
异步系统不会等待前一个任务完成,当给定任务正在进行时,它会继续执行另一项任务。同步编程模型
在同步编程中,每一行代码都是按顺序执行的。在网络或文件 IO 调用的情况下,执行线程会阻塞。让我们看一下同步代码执行的示例。
我们将以电子商务系统为例。假设我们有一个函数,可以根据订单获取所有商品。然后它会为这些项目创建一个 CSV 文件并存储它。此外,它通过电子邮件将订单状态信息发送给客户。在上述情况下,我们的代码将按顺序执行,即第 10、11 和 12 行。
这些fetchItems函数执行数据库调用。数据库调用代价很大,因为它是 IO 调用。一旦我们调用该fetchItems方法,主线程就会阻塞。直到从数据库成功返回所有项目,它才恢复。
该createCsvFileForItems函数处理项目并生成 CSV 文件。该函数再次将主线程置于等待状态。一旦文件创建成功,该函数将返回。此外,它将调用该sendOrderStatus方法。
该方法sendOrderStatus主要是使用电子邮件地址并将订单状态发送给客户。
假设每个函数所花费的时间如下:fetchItems- 5 毫秒createCsvFileForItems- 10 毫秒sendOrderStatus- 8 毫秒
程序完成所需的总时间为 23 毫秒,sendOrderStatus函数将在 15 毫秒后调用。实际上sendOrderStatus功能是比较独立。但是,它仍然需要等待前面两个功能完成。假如我们先调用sendOrderStatus,在这种情况下,fetchItems函数必须等待 8 毫秒。
每个功能花费的时间
此外,当函数被调用时,主线程会阻塞。当线程进入等待状态时,它无法做任何有用的工作。如果应用程序在多核 CPU 上运行,则只会使用一个 CPU。这会导致其他 CPU 闲置。
通过在不同线程中执行独立任务,我们可以充分利用所有 CPU 内核。在上面的示例中,这可以通过并行运行fetchItems和sendOrderStatus来完成。完成后,我们可以使用结果然后调用createCsvFileForItems。异步编程模型
在异步编程中,独立的任务在不同的线程上并行执行。一旦任务完成并返回结果,相关任务就会作为回调被调用。独立任务不会阻塞主线程,我们可以利用 CPU 的所有核心。
在上面的代码中,我们有每个方法的异步版本。该代码不会依次执行第 32、33 和 34 行。它将调用fetchItemsAsync方法新起一个线程从数据库中获取数据。随后,它将调用该sendOrderStatusAsync方法而无需等待第一个函数完成,此方法将在不同 CPU 上的单独线程上运行。在第 33 行,该fetchItemsAsync方法返回一个Future。主线程将在第 35 行等待这个Future并获取它的值。
该功能的执行将如下图所示:
异步函数执行 Java 中的异步编程
Java 提供了实现异步编程的接口和类,如CompletionStage、CompletableFuture ,表示返回一个异步执行未来的结果。
在上面的示例中,该方法fetchItemsAsync返回了Future>,简单理解未来会返回的数据。此方法定义并初始化一个 CompletableFuture。在 Executor API 的帮助下,它将执行启动一个新线程运行。计算完成后,它会完成 future(第 48 行),然后返回它。
由于fetchItemsAsync是异步的,主线程可以同时调用sendOrderStatus 方法。因此,它不需要等待前一种方法完成。然后它会在以后使用get方法得到最终的结果。主线程将阻塞调用 get 方法,并在结果可用后恢复。
我们可以避免上述样板代码并使用 CompletableFuture 的 API。CompletableFuture 提供方法supplyAsync和runAsync。Supplier 接口是一个不接受任何参数的功能接口。它返回参数化类型的值。
使用可完成的期货
supplyAsync我们在上面的代码片段中使用函数。在内部,此函数将在一个线程中从 java 中的 ForkJoinPool 执行代码,该thenApply构造处理异步计算阶段的结果。
如上所示,fetchItems调用异步返回项目列表。然后将结果提供给createCsvFileForItems函数。此函数充当回调函数,并在fetchItems函数完成后被调用。程序开始执行函数sendOrderStatus,无需等待第一阶段的计算完成。因此,我们使用异步编程解耦了两个独立的任务。总结
我们通过上面简单讲解了同步和异步编程模型,我们来总结下各自的优缺点。
同步编程模型优点 同步编程简单易行。它非常适合 CPU 密集型任务。更适合简单的系统。调试同步系统更容易。
同步编程模型缺点它不适合 IO 绑定任务,CPU 内核未得到充分利用。它引入了两个任务之间的依赖关系,一个任务可以阻止另一个任务的执行。不适用于高吞吐量和低延迟系统
异步编程模型优点可以并行启动独立任务, 它充分利用了所有的计算资源。有利于 IO 任务。可扩展且适用于高吞吐量工作负载。
异步编程模型缺点需要很多回调函数, 调试有时变得困难。不利于 CPU 密集型任务。在某些编程语言中难以实现。
旷望祁连尚晴雪,千里冰雪醉酒泉错过了夏天的西瓜,没有得到秋天的奶茶,但我始终相信,冬天的西北风一定有我一口!这种天气的被窝每伸向一块新地方,都是一种探险!不妨跟着小编了解酒泉玉门不一样的冬季特色风景从而尊享高端
浙江省这座土豪城市,盛产老板,还被评为最具幸福感城市这里是刘小顺的旅行和生活研究所。浙江省位于我国的华东地区,是长三角的重要组成部分,同时也是一个经济非常发达的省份,一直以来都是富庶发达之地。而说起浙江省的著名城市,肯定很多人都会想
乡村爱情15开播,互怼名场面让人忍俊不禁,这才是年的味道1月12日晚,备受瞩目的赵家班新作乡村爱情15正式登陆短视频平台,相较于以前小年夜与广大观众见面,2023年,乡村爱情15开播的时间比以往来得更早一些。正所谓乡爱来了就是年,从首播
从妈妈,买绿豆里看慢生活里的烟火气,简单文字里有爱的味道幼儿园老师让孩子在家里认识各种小豆子,玩豆子分类的游戏,还可以讲一下和豆子有关的绘本。我家孩子一下想起妈妈,买绿豆这本书了。这本书当时是因为我要画思维导图所以买了,没想到家里两个孩
香港通关,超实用内地香港往返秘籍!1月8日更新之前去香港是需要抗原的,但现在需要48小时核酸!!(!粤康码的凭证就可以)其实往返香港无非就是两种身份香港人or内地人内地人(包括从海外经香港回国的內地人士)去香港不用
中兴千兆光网筑基云VR教育创新应用获最佳创新应用案例奖近日,中国通信企业协会主办的ICT中国(2022)优秀案例征集与评选公布了获奖名单,中兴通讯申报的千兆光网筑基云VR教育创新应用,荣获最佳创新应用案例奖。中兴通讯为解决传统职业教育
开年逛地标,烟火气里透出经济韧性底色调查观察活力中国新华社北京1月13日电1月12日,新华每日电讯发表题为活力中国烟火气里的信心和期待地标篇的报道。武汉汉正街吆喝声唤醒老商街新华每日电讯记者徐海波一度沉寂的汉正街又热闹起来了。随着春
再见2022辞慕尔尔,烟火年年,愿日子清透,世事皆温柔光阴,是纸上的长短,开一句,落一句。谁的去年天气,旧亭台,谁的秋千院落,夜沉沉谁的池塘,入了春草梦,谁的梧叶,染满秋声谁的月色,染了相思,谁的雪色,许了流年。走过2022,翻开岁月
2023,我们向着梦想出发一元复始,万象更新。不经意间2022已悄然落幕,过去的一年里,我们经历了挫折也收获了成长,过程中铭刻着我们难忘的故事,不管梦想实现与否,2023已乘风而至,我们会继续迎风斩浪,向着
文案挑一句话送给自己吧头条创作挑战赛1。南来北往,不辜负生活,不迷失方向送心2。好好爱自己,把期望降低,把依赖变少,你会过得很好3。别让生活蹂躏了你的眉目和热情。4。将就永远不是我的风格5。生命只有一次
贵大的冬澄澈温暖冬日文笔挑战来啦!贵州大学冬意渐浓,岁月轻慢带着一身寒霜,去寻烟火里的暖贵大的冬文笔挑战一月凛冬已至,星河长明我们回忆贵大的冬,将思念成文接下来,让我们来看看那些关于贵大的冬的文笔挑战01hrGui