FLutter里的“線程” 一文通關

前言

在Flutter中,啟動一個新線程來處理任務通常是指在另一個隔離區(isolate)中執行代碼。由于Dart使用單線程模型,它通過隔離區來實現并發。隔離區是獨立的執行線程,不共享內存,通過消息傳遞來通信。這種方法可以用來運行長時間或資源密集型的任務,而不會阻塞主UI線程。

為什么Dart是單線程模型

Dart 的單線程模型避免了諸如線程同步、鎖定、死鎖和競爭條件等復雜問題,避免了線程間的資源沖突。

Dart 使用事件循環來管理事件和消息。這種機制類似于JavaScript的處理方式,允許執行環境管理大量的異步操作。Dart 的事件循環使得它在處理I/O密集型操作(如網絡通信、文件操作等)時非常高效,因為它可以在等待這些操作完成時繼續執行其他代碼,從而不阻塞主線程。

雖然Dart是基于單線程模型,但它通過隔離區(獨立的工作區域)支持并發執行。每個隔離區有自己的內存堆和事件循環,它們通過消息傳遞相互通信,這避免了傳統多線程編程中常見的內存共享問題。這種模型在提供并發性的同時,還保持了代碼的安全性和可維護性。

隔離區的并發不依賴于操作系統的進程調度,而是由Dart虛擬機(VM)控制。Dart VM 管理所有隔離區,并在可用的處理器核心之間調度它們的執行。

如何在flutter新建一個“線程”

定義一個函數,這個函數將在新的隔離區中運行。這個函數可以執行任何長時間運行的任務,比如數據庫操作、文件處理等。

void doWork(SendPort sendPort) {// 執行一些長時間的任務sendPort.send("任務完成");
}

然后可以在Flutter應用中的任何位置啟動一個新的隔離區,并傳遞上面創建的函數給它,同時還需要創建一個ReceivePort來接收來自隔離區的消息。

void startIsolate() async {// 創建一個ReceivePort用于接收來自隔離區的消息ReceivePort receivePort = ReceivePort();// 啟動一個隔離區,并傳遞給它一個SendPortIsolate.spawn(doWork, receivePort.sendPort);// 監聽來自隔離區的消息receivePort.listen((data) {print(data); // 輸出從隔離區接收到的數據});
}

Future

在Dart中,Future是一個核心類,用于表示一個可能在未來某一時刻返回結果的異步操作。當執行一個耗時操作,如網絡請求或文件讀取時,這個操作將不會立即完成,并且其結果將在未來某個時刻可用。Future就是用來處理這種情況的。

Future<String> fetchData() {return Future.delayed(Duration(seconds: 4), () {return 'Data loaded';});
}

async和await

這兩個關鍵字一起使用,簡化了異步編程的復雜性,使得異步代碼的書寫和閱讀更接近同步代碼的風格。

  • async: 用于聲明一個函數是異步的。它修改了函數的行為,使得函數返回一個Future。這意味著函數即使完成執行,其返回的結果也可能還不可用。

  • await: 用在異步函數(被async修飾的函數)內部,用來暫停執行當前的異步函數,直到某個異步操作完成并返回結果。await只能在async函數中使用。

將上面的fetchData函數與await一起使用,看看如何在實際代碼中調用它:

Future<void> printData() async {String data = await fetchData(); // 等待fetchData函數的Future完成print(data); // 打印加載的數據
}

printData函數中,使用await關鍵字暫停執行,直到fetchDataFuture完成。這種方式使得異步代碼的流程看起來像是同步的,便于理解和維護。

在Dart中,當使用asyncawait時,實際上是在當前的執行線程(通常是主線程)上調度異步任務。這些任務被安排在事件隊列中,等待事件循環來處理。當一個異步操作(如網絡請求、文件I/O等)被觸發時,它會被排入事件循環,并在操作完成后的某個時刻返回結果,此時await會恢復函數的執行。

在Dart中,這種看似同時進行的操作實際上是通過事件循環(event loop)來實現的,這是一種典型的異步編程模式。

Dart 的單線程模型并不意味著它不能同時處理多個任務。實際上,Dart 使用一個叫做事件循環的系統來高效地管理單線程中的多個任務。這里的關鍵是任務被分為微任務(microtasks)和事件(events):

微任務(Microtasks):這些任務擁有高優先級,通常用于處理短暫且緊急的工作。微任務隊列在事件隊列之前執行,并且一旦開始,整個微任務隊列會被執行完畢,直到沒有微任務為止。

事件(Events):這些任務通常包括I/O操作,如網絡請求、文件操作、定時器等。事件隊列中的任務會在微任務隊列為空時執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17753.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript 自定義屬性操作

在 JavaScript 中&#xff0c;可以使用自定義屬性來存儲與元素相關的數據。自定義屬性允許開發人員在元素上存儲任何類型的數據&#xff0c;包括字符串、數字、對象等。接下來&#xff0c;我將詳細解析如何在 JavaScript 中操作自定義屬性&#xff0c;并提供相應的代碼示例。 …

四川農業大學Java實訓項目圓滿收官,匯智知了堂引領學子實踐創新

近日&#xff0c;四川農業大學與匯智知了堂共同舉辦的Java實訓項目正式迎來了項目匯報階段。本次實訓是匯智知了堂在高等教育領域深化校企合作、推動產教融合的一次重要實踐&#xff0c;旨在為廣大學子提供一個將理論知識與實際操作相結合的平臺。 在實訓過程中&#xff0c;匯…

cherry-markdown公式不好選中的問題

在我上一篇博客中&#xff0c;在解決公式插入預覽無效之后&#xff0c;還f發現cherry-markdown是通過css的:hover來進行公式的展示&#xff0c;導致不好選中 上一篇博客速達&#xff1a;cherry-markdown公式能插入但是預覽無效-CSDN博客 下面是解決方案&#xff0c;其實就是改…

selenium源碼學習

這里寫自定義目錄標題 歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants 創建一個自定義列表如何創建一個…

vr數字成果展在線展示突破用戶傳統認知

想要輕松搭建一個充滿互動與創意的3D數字展廳嗎?vr互動數字展廳搭建編輯器將是您的不二之選!華銳視點3D云展平臺提供的vr互動數字展廳搭建編輯器將空間重建與互動制作完美結合&#xff0c;讓您輕松實現3D空間的搭建與互動營銷制作。 在vr互動數字展廳搭建編輯器的幫助下&#…

ai語音機器人工作的原理流程電銷機器人部署

ai機器人電銷其實就相當于一個程序&#xff0c;可以代替人工進行一個電話外呼工作&#xff0c;可以模擬真人對話、智能回答客戶問題。 其實機器人這個東西很早之前就已經有了&#xff0c;但是近幾年&#xff0c;才被電銷企業所應用。目前ai機器人電銷已經取代了一部分人工&…

牛客題霸-SQL大廠面試真題(一)

本文基于前段時間學習總結的 MySQL 相關的查詢語法&#xff0c;在牛客網找了相應的 MySQL 題目進行練習&#xff0c;以便加強對于 MySQL 查詢語法的理解和應用。 由于涉及到的數據庫表較多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代碼與示例輸出。 以下內容是…

抖店類目錯放怎么辦?怎么改類目?快速解決抖店類目錯放問題

大家好&#xff0c;我是電商花花。 我們運營抖音小店的時候&#xff0c;都知道不要放錯類目&#xff0c;也知道放錯類目的后果&#xff0c;類目錯放可能導致商品無法在正確的類目中展示&#xff0c;從而影響到商品的一個曝光率。 嚴重的話還被平臺扣分&#xff0c;扣保證金&a…

隱藏服務器源IP怎么操作,看這一篇學會!

在當今的網絡環境中&#xff0c;服務器作為信息和服務的中樞&#xff0c;常駐于公網之上&#xff0c;面臨著各式各樣的安全威脅&#xff0c;其中&#xff0c;分布式拒絕服務&#xff08;DDoS&#xff09;攻擊尤為猖獗&#xff0c;它通過協調大量計算機同時向目標服務器發送請求…

跳繩步法匯總

跳繩步法 跳繩是一項多樣化且富有樂趣的運動&#xff0c;擁有許多不同的步法和技巧。以下是一些常見的跳繩步法&#xff1a; 1. 基本步法 雙腳并跳&#xff1a;雙腳并攏一起跳&#xff0c;每次跳繩通過腳下時雙腳同時離地。單腳跳&#xff1a;用一只腳跳&#xff0c;另一只腳…

設計一套Kafka到RocketMQ的雙寫+雙讀技術方案,實現無縫遷移!

設計一套Kafka到RocketMQ的雙寫雙讀技術方案&#xff0c;實現無縫遷移&#xff01; 1、背景2、方案3、具體邏輯 1、背景 假設你們公司本來線上的MQ用的主要是Kafka&#xff0c;現在要從Kafka遷移到RocketMQ去&#xff0c;那么這個遷移的過程應該怎么做呢&#xff1f;應該采用什…

JAVA開發面試超詳細

一、Java 基礎 1.JDK 和 JRE 有什么區別&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向開發人員的&#xff0c;是開發工具包&#xff0c;包括開發人員需要用到的一些類。 jre是java運行時環境&#xff0c;包括java虛擬機…

Selenium探險家:駕馭Web自動化的秘籍與實戰

Hi&#xff0c;我是阿佑&#xff0c;今天將帶大伙們學會如何使用Selenium進行高效的網站測試&#xff0c;如何配置Selenium Grid實現分布式測試&#xff0c;以及如何預測和擁抱自動化測試的未來&#xff01; 文章目錄 1. 引言2. 背景介紹2.1 Selenium概覽2.2 Python與Selenium的…

python數據可視化:自定義閉合區域填充顏色matplotlib.pyplot.fill()

【小白從小學Python、C、Java】 【考研初試復試畢業設計】 【Python基礎AI數據分析】 python數據可視化&#xff1a; 自定義閉合區域填充顏色 matplotlib.pyplot.fill() [太陽]選擇題 以下關于matplotlib.pyplot.fill()函數說法正確的是&#xff1f; import matplotlib.pyplo…

【ARM+Codesys案例】T3/RK3568/樹莓派+Codesys鋰電疊片機方案:結合CODESYS實現高效生產

鋰電疊片機解決方案 乘風破浪&#xff0c;促進新能源行業發展 鋰電池是依靠鋰離子在正極與負極之間移動來達到充放電目的的一種可充電電池&#xff0c;具有高能量密度、高電壓、壽命長、無記憶效應等優點。鋰電池屬于國家政策扶持的高速發展行業&#xff0c;近年發展快速&…

【Beyond Compare】專業的文件對比工具

一、Beyond Compare官方下載 二、Beyond Compare簡介 三、Beyond Compare 4激活 一、Beyond Compare官方下載 Beyond Compare官方下載 https://www.beyondcompare.cc/ Beyond Compare 4中文包 鏈接&#xff1a;https://pan.baidu.com/s/14igdUm0Xy7DFp4Jzb58AZg?pwdGLNG 提…

newinit.sh挖礦攻擊處理與規避方案

目錄 攻擊分析 恢復措施&#xff1a; 問題排查 攻擊入口分析 預防 臨時處理方案&#xff1a; 攻擊分析 攻擊者&#xff1a;職業黑客&#xff08;99%&#xff09; 攻擊方式&#xff1a;挖礦病毒newinit.sh和蠕蟲病毒pnscan 中毒現象: 服務器負載異常&#xff0c;具體表…

CTFHUB技能樹——SSRF(一)

目錄 一、SSRF(服務器端請求偽造) 漏洞產生原理: 漏洞一般存在于 產生SSRF漏洞的函數&#xff08;PHP&#xff09;&#xff1a; 發現SSRF漏洞時&#xff1a; SSRF危害&#xff1a; SSRF漏洞利用手段&#xff1a; SSRF繞過方法&#xff1a; 二、CTFHUB技能樹 SSRF 1.Ht…

結構體的偏移地址,首地址的宏計算

C語言的庫函數中提供了計算結構體的一個元素在結構體中的偏移量&#xff0c;以及通過偏移量和結構體中元素的指針計算出來結構體的首地址。但是在一些場景沒有辦法使用C語言庫中的函數&#xff0c;那么就需要自己進行定義。 如下面代碼所示的兩個宏定義就完成了計算結構體成員偏…

如何解決elment ui必填驗證輸入空格通過校驗?

很久之前有個客戶定制了一個ERP系統,里面有個單位的必填項,是沒有任何規律的字符串,也就是只需要做必填即可,結果前段時間維護該信息的換了一個人,必填的單位居然是空白,因為數據缺失的原因導致后面一系列的工作流一個都提交不了,該員工意識到自己闖禍后直接跑路,聯系不…