dart 雖然是乙個單執行緒語言 但是不代表他不支援多執行緒併發
在mainisolate
中建立newisolate
有兩種方法spawn
,spawnuri
建立步驟
建立
newisolate
並與當前呼叫mainisolate
並通過sendport
建立連線建立
newisolate
獲得mainisolate
的mainreciveport
和mainsendport
傳送資料
接收資料通過
在合適的機會銷毀isolate
下面看具體的步驟
message
只有[message]作為entrypoint
的引數。
即entrypoint
函式就是要在**newisolate
**中執行的函式
因為isolate相互通訊需要持有對方的sendport
這樣**newisolate
持有了mainsendport
**
所以是通過入口函式將**主isolate的sendport
傳送到newisolate
**
需要注意isolate 的「入口函式(entrypoint
)」必須是頂級函式或靜態方法。
示例**
import 'dart:io';
import 'dart:isolate';
main() async
isolate newisolate;
void createisolate() async else
});}// 入口函式將在newisolate中執行
void excuter(sendport mainsendport) );
// 獲取newisolate的 sendport
sendport new_send = new_rp.sendport;
//將其傳送到 mainisolate
// 讓 mainisolate 持有 newsendport,用於通訊
// 使 mainisolate 可以通過 newsendport 將 mainisolate 的傳送訊息回 newisolate
mainsendport.send([0, new_send]);
// 模擬耗時5秒
sleep(duration(seconds: 5));
mainsendport.send([1, "excuter 任務完成"]);
print("newisolat 執行結束");
}//銷毀newisolate
destroynewisolate()
/* 輸出
newisolat通過main_send傳送來一條訊息 [0, sendport] ,到mainisolate
newisolat通過main_send傳送來一條訊息 [1, excuter 任務完成] ,到mainisolate
newisolat 執行結束
mianisolate 通過new_send傳送了一條訊息到newisolate
銷毀newisolate
*/
注意這種方式
示例**
newisolate
檔案newtaskuri.dart
輸出結果
無論是上面的**spawn
還是spawnuri
**,執行後都會建立兩個isolate
想要相互通訊就必須持有對方的sendport
釋放newisolate
platform-channel 通訊僅僅由主 isolate 支援。該主 isolate對應於應用啟動時建立的isolate。
區別
可以看到 無論是實現上述哪一種isolate **數量都是比較繁瑣的對此flutter提供了乙個函式**
compute
** 該函式封裝了通過spawn
實現isolate
的**避免我們去寫通過
spawn
建立isolate的一系列**,直接通過compute函式,這樣讓我們的**看起來更簡潔了
如果任務只是進行一次計算返回結果,不需要雙端多次溝通的話 使用compute 函式將非常簡單
compute(computecallbackcallback, q message)
message為訊息 可以是callback執行函式的引數 示例
怎麼樣 是不是很簡單
直觀的說可以根據任務執行時間長短來區分
掘金文章 [譯] flutter 非同步程式設計:future、isolate 和事件迴圈
多執行緒併發
多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...
多執行緒併發
更簡單的執行緒池 多執行緒和多程序都可以很容易的實現併發,協程通過切換上下文來充分利用cpu實現併發效果 threading模組 thread類的基本狀態和行為 屬性名和值 name none,group none,target none,args kwargs daemon none 方法 sta...
(多執行緒)多執行緒的併發安全
多執行緒併發操作同乙個資源 同步鎖 多執行緒操作的鎖必須唯一 必須搞清楚 哪些 需要同步?那些在操作共享資源的 只要包含非讀的操作,或者根據共享資源進行條件判斷的,就需要同步!同步 塊解決 package com.gc.thread 多執行緒操作共享資源 併發 執行緒安全問題 同步 鎖 相對而言效能...