偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一篇文章,搞明白異步和多線程

開發(fā) 架構(gòu)
在本文中,我們通過一些通俗易懂的方式來解釋異步編程和多線程編程,然后再介紹一下它們之間的區(qū)別。

[[381798]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序新視界」,作者丑胖俠二師兄 。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序新視界公眾號(hào)。  

最近在研究Spring Boot中的異步處理,發(fā)現(xiàn)涉及到異步和多線程的很多知識(shí)點(diǎn),就先寫幾篇關(guān)于異步與多線程的文章,帶大一起回顧或?qū)W習(xí)一下相關(guān)的知識(shí)點(diǎn)。下面開始正文內(nèi)容:

前言

在本文中,我們通過一些通俗易懂的方式來解釋異步編程和多線程編程,然后再介紹一下它們之間的區(qū)別。

什么是異步編程

首先來看一下異步模型。在異步模型中,允許同一時(shí)間發(fā)生(處理)多個(gè)事件。程序調(diào)用一個(gè)耗時(shí)較長(zhǎng)的功能(方法)時(shí),它并不會(huì)阻塞程序的執(zhí)行流程,程序會(huì)繼續(xù)往下執(zhí)行。當(dāng)功能執(zhí)行完畢時(shí),程序能夠獲得執(zhí)行完畢的消息或能夠訪問到執(zhí)行的結(jié)果(如果有返回值或需要返回值時(shí))。

下面通過一個(gè)示例來看一下同步和異步的區(qū)別。示例中程序通過網(wǎng)絡(luò)獲取兩個(gè)文件,并對(duì)兩個(gè)文件進(jìn)行合并處理:

異步與同步

上述示例,在異步系統(tǒng)當(dāng)中的解決方案是開啟一個(gè)額外的線程進(jìn)行處理。第一個(gè)線程獲取第一個(gè)文件,第二個(gè)線程獲取第二個(gè)文件,第二個(gè)線程并不需要等待第一個(gè)線程執(zhí)行完畢再執(zhí)行。當(dāng)兩個(gè)線程都獲得到對(duì)應(yīng)的結(jié)果之后,再重新同步處理合并結(jié)果的操作。

再來看另外一個(gè)場(chǎng)景。單線程方法讀取OS(操作系統(tǒng))當(dāng)中的文件并需要進(jìn)行數(shù)學(xué)運(yùn)算。而在異步系統(tǒng)中,程序發(fā)起讀取OS中文件的請(qǐng)求,由于讀取操作比較耗時(shí),在等待讀取文件時(shí),程序會(huì)將控制器返回給CPU進(jìn)行數(shù)學(xué)運(yùn)算。

在異步編程中,通常會(huì)針對(duì)比較耗時(shí)的功能提供一個(gè)函數(shù),函數(shù)的參數(shù)中包含一個(gè)額外的參數(shù),用于回調(diào)。而這個(gè)函數(shù)往往稱作回調(diào)函數(shù)。當(dāng)比較耗時(shí)的功能執(zhí)行完畢時(shí),通過回調(diào)函數(shù)將結(jié)果返回。關(guān)于回調(diào)函數(shù)相關(guān)的知識(shí)可參考文章《兩個(gè)經(jīng)典例子讓你徹底理解java回調(diào)機(jī)制》。

什么是多線程編程

多線程是指同時(shí)并發(fā)或并行執(zhí)行多個(gè)指令(線程)。

在單核處理器上,多線程往往會(huì)給人程序是在并行執(zhí)行的錯(cuò)覺。實(shí)際上,處理器是通過調(diào)度算法在多線程之間進(jìn)行切換和調(diào)度?;蛘吒鶕?jù)外部輸入(中斷)和線程的優(yōu)先級(jí)的組合來進(jìn)行線程的切換。

在多核處理器上,線程才是真正的并行運(yùn)行。多個(gè)處理器同時(shí)執(zhí)行多個(gè)線程,以達(dá)到更加高效的處理。

一個(gè)簡(jiǎn)單的示例就是:開啟兩個(gè)瀏覽器窗口同時(shí)下載兩個(gè)文件。每個(gè)窗口都使用一個(gè)新的線程去下載文件,它們之間并不需要誰(shuí)等待誰(shuí)完成,而是并行進(jìn)行下載。

下圖展示了并發(fā)執(zhí)行多線程應(yīng)用程序的流程:

多線程執(zhí)行

異步與多線程的區(qū)別

通過上面的介紹,我們可以看出多線程都是關(guān)于功能的并發(fā)執(zhí)行。而異步編程是關(guān)于函數(shù)之間的非阻塞執(zhí)行,我們可以將異步應(yīng)用于單線程或多線程當(dāng)中。

因此,多線程只是異步編程的一種實(shí)現(xiàn)形式。

比如,你和你的朋友決定一起做一頓午餐。“異步”就是你對(duì)朋友說:“你去商店買意大利面,回來的時(shí)候告訴我一聲,然后一起做午餐。在你買意大利面的同時(shí),我去準(zhǔn)備番茄醬和飲料。”

而“線程”是:“你燒水,我加熱番茄醬。當(dāng)水燒開了,告訴我,我把意大利放進(jìn)去。當(dāng)番茄醬熱了,你可以把奶酪添加進(jìn)去。當(dāng)兩者都完成了,就可以坐下來一起吃晚餐。”在線程的示例中,我們可以看到“When,Do”的事件順序,而這些順序代表著每個(gè)人(線程)的指令集集合的順序。

上述示例可以看出,多線程是與具體的執(zhí)行者相關(guān)的,而異步是與任務(wù)相關(guān)的。

多線程是程序設(shè)計(jì)的邏輯層概念,它是進(jìn)程中并發(fā)運(yùn)行的一段代碼,可以實(shí)現(xiàn)線程間的切換執(zhí)行。

異步和同步是相對(duì)的,異步就是彼此獨(dú)立,在等待某事件的過程中繼續(xù)做自己的事,不需要等待這一事件完成后再工作。

多線程就是實(shí)現(xiàn)異步的一個(gè)方式。異步是讓調(diào)用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情。

所以本質(zhì)上,異步和多線程并不是一個(gè)同等關(guān)系,異步是最終目的,多線程只是實(shí)現(xiàn)異步的一種手段。

如何選擇

面對(duì)多線程和異步,我們?cè)撊绾芜x擇呢?其實(shí),通常情況下選擇的依據(jù)是主要取決于性能。

那么,同步/異步與單線程/多線程之間的所有組合,哪種模型表現(xiàn)更好?

簡(jiǎn)而言之,對(duì)于具有大量I/O操作和不同計(jì)算的大規(guī)模應(yīng)用程序,使用異步多線程有利于充分利用計(jì)算資源,并且能夠照顧到非阻塞函數(shù)。這也是所有操作系統(tǒng)所采用的線程模型。

編寫異步操作的復(fù)雜程度較高,程序主要使用回調(diào)方式進(jìn)行處理,與正常的思維方式有些出入,而且難以調(diào)試。而多線程的使用(濫用)會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),并且線程間的共享變量可能造成死鎖。

因此在實(shí)現(xiàn)這兩種模式時(shí),往往需要處理資源競(jìng)爭(zhēng)、死鎖、共享資源和回調(diào)事件等問題。

小結(jié)

在本文中,我們講解了異步編程和多線程編程的定義,然后是它們之間的區(qū)別。而本文中的所有術(shù)語(yǔ)和概念均與具體技術(shù)實(shí)現(xiàn)無關(guān)。后面我們會(huì)繼續(xù)講解多線程與異步相關(guān)的其他知識(shí)點(diǎn),比如異步調(diào)用與回調(diào)等。

 

責(zé)任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2019-09-24 14:19:12

PythonC語(yǔ)言文章

2023-04-06 08:37:24

2021-05-08 07:14:38

MySQL數(shù)據(jù)庫(kù)安全性

2023-01-03 18:32:32

2020-10-09 08:15:11

JsBridge

2017-11-02 14:06:40

2015-07-15 17:09:48

HiveHadoop分布式文件系統(tǒng)

2018-04-09 16:35:10

數(shù)據(jù)庫(kù)MySQLInnoDB

2017-09-05 08:52:37

Git程序員命令

2022-02-21 09:44:45

Git開源分布式

2019-04-17 15:16:00

Sparkshuffle算法

2024-06-25 08:18:55

2021-06-30 00:20:12

Hangfire.NET平臺(tái)

2023-05-12 08:19:12

Netty程序框架

2021-04-09 08:40:51

網(wǎng)絡(luò)保險(xiǎn)網(wǎng)絡(luò)安全網(wǎng)絡(luò)風(fēng)險(xiǎn)

2021-03-08 08:55:22

開發(fā)

2022-11-04 10:45:11

Java基礎(chǔ)CPU

2023-07-28 07:14:13

2022-10-08 15:07:06

ChatOps運(yùn)維

2022-08-04 09:39:39

Kubernetes聲明式系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)