15 Flutter 多執行緒(二)

2021-10-07 12:24:00 字數 3147 閱讀 5109

詳細**參見demo

demo位址 -> flutter_isolatedemo

import 'dart:async';

import 'dart:io';

import 'dart:isolate';

import 'package:dio/dio.dart';

import 'package:flutter/foundation.dart';

void main()

//******************************* 多執行緒 ********************************

void tesisolatedemo()

// -------------------------- 多執行緒1 --------------------------

void isolatedemo1()

1、無序

flutter: 3結束

flutter: 1結束

flutter: 2結束

flutter: 5結束

flutter: 4結束

compute 是多執行緒執行,執行完的先後順序是無序的

// -------------------------- 多執行緒2 --------------------------

void isolatedemo2()

void func1(int count) {}
1.2.1、有序

future loaddata() );

}

flutter: 1結束

flutter: 2結束

flutter: 3結束

flutter: 4結束

flutter: 5結束 

compute 不加 return 是有序的,因為future 非同步但還是在主線程執行的,而且是順序新增寄**的,可以列印一下其執行緒。

flutter: main

flutter: 1結束

flutter: main

flutter: 2結束

flutter: main

flutter: 3結束

flutter: main

flutter: 4結束

flutter: main

flutter: 5結束 

可以發現都是在 main 主線程執行的。

在func1中列印一下執行緒

void func1(int count)
flutter: 1結束

flutter: 2結束

malformed message

flutter: _spawn

flutter: _spawn

flutter: 3結束

flutter: 4結束

flutter: _spawn

flutter: _spawn

flutter: 5結束

flutter: _spawn

1.2.2、無序

future loaddata() );

}

compute  加上 return 那麼loaddata 返回的就是 compute 之後執行緒的future。就不再是都在主線程了,所以就是無序的了。

//************************** 驗證一下then 到底是微任務還是什麼? **********************

void testthendemo() );

x.then((value) => print('c非同步1結束'));

print('d主任務');

}

驗證一下then 到底是微任務還是什麼?

flutter: d主任務

flutter: a非同步任務1

flutter: c非同步1結束

flutter: b微任務

可以發現,如果說then 是做為微任務加入的話,那它應該是在b微任務之後加入的,在新一輪的任務迴圈中,應該先執行b才對。根據執行結果,我們猜測應該是then 和 a非同步這個future 是同乙個任務迴圈中執行的,當then 沒有執行完的時候,這個任務迴圈是沒有結束的,當then執行完才會進入到下乙個任務迴圈去判斷微任務,事件任務等去執行。

目前沒有什麼官方說明這個到底算什麼。

//********************* timer ***********************

void testtimerdemo() );

print('來了');

}

timer

flutter: 來了

flutter: 非同步任務!

timer 是非同步執行的

timer的應用

詳細**參見demo

demo位址 -> wechat_demo

chat_page.dart

拖拽頁面(滑動頁面)的時候timer 並沒有停止,所以timer 和 ui 是在同乙個優先順序上。只有微任務優先順序最高

@override

void initstate()

});

當切換頁面的時候,再切換回來發現會重新建立了乙個新的time,這時候可以通過保持頁面狀態,不讓重新走initstate。但是有時候我們真的需要銷毀這個頁面,但是這個時候雖然頁面銷毀了,可以timer 還在。那麼就需要再頁面銷毀的時候去手動的銷毀timer,那就要用到 dispose

//  類似ios 中的dealloc

@override

void dispose()

super.dispose();

}

15 多執行緒

程序 進行中的程式,只有程式在執行過程中,才能稱之為程序。計算機cpu分配資源的最小單位。執行緒 每個程序至少包含乙個執行緒。程序和執行緒的關係就像車和車輪,執行緒不是越多越好,要結合實際的硬體條件。執行緒是cpu排程和分派的基本單位 執行緒執行的基本概念 單核心cpu的情況,執行緒是輪流交替執行,...

java多執行緒JDK1 5 二

5 public classexecutorcompletionserviceextends object implements completionservice 使用提供的executor來執行任務的completionservice。此類將安排那些完成時提交的任務,把它們放置在可使用 take...

第15章 多執行緒

模擬銀行取錢的問題 1.定義乙個account類 1 該account類封裝了賬戶編號 string 和餘額 double 兩個屬性 2 設定相應屬性的getter和setter方法 3 提供無參和有兩個引數的構造器 4 系統根據賬號判斷與使用者是否匹配,需提供hashcode 和equals 方法...