最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Dart多個future隊列完成加入順序關系及原子性論證

 更新時間:2022年11月11日 15:56:17   作者:李小轟_Rex  
這篇文章主要介紹了Dart多個future隊列完成加入順序關系及原子性論證,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

Dart 是一個在單線程中運行的程序。在程序中執(zhí)行一個需要長時間的執(zhí)行的操作,為避免卡住UI主線程,我們會用到異步(future),可以使程序在等待一個耗時操作完成時繼續(xù)處理其他工作。

在進入正題之前,我們先了解一下 Dart 的消息循環(huán)機制:

  • Dart 從兩個隊列執(zhí)行任務:Event事件隊列Microtask微任務隊列
  • 事件循環(huán)會優(yōu)先處理微任務隊列,microtask清空之后才將 event事件隊列中的下一個項目出隊并處理
  • 事件隊列具有來自Dart(Future,Timer,Isolate Message等)和系統(tǒng)(用戶輸入,I/O等)
  • 微任務隊列目前僅包含來自Dart,當然我們也可以自己往微隊列中插入任務

什么是 Future

Future 是什么?這里我們用小篇幅簡單描述一下。future是一個異步的執(zhí)行操作,可以在不阻塞代碼的情況下實現(xiàn)耗時功能。

main() {
  Future(() {
    print('我是一個耗時操作');
  }).then((value){
    print('future 結(jié)束了');
  });
  print('main');
}

 //打印結(jié)果
main
我是一個耗時操作
future 結(jié)束了

在項目中,我們使用 FutureAsyncawait 相互組合實現(xiàn)異步編碼。

Future 操作具備'原子性'嗎

上面的篇幅我們說過,future 創(chuàng)建后會被直接加入到事件隊列依次執(zhí)行。那么在上一個 future 在沒有標識完成前,下一個 future 可以被執(zhí)行嗎?

小編寫了幾個樣例來做實驗:

實驗寫法一:

main() {
  Test1.future1().then((value) => print(value));
  Test1.future2().then((value) => print(value));
}
abstract class Test1 {
  static Future<String> future1() async {
    return Future(() async {
      print('開始 future1');
      await TestTool.timeConsume(1000000000); //耗時運算
      print('一千年過去了');
      return 'future1 結(jié)束了';
    });
  }
  static Future<String> future2() async {
    return Future(() async {
      print('開始 future2');
      await TestTool.timeConsume(1000); //耗時運算
      print('繼續(xù) future2');
      return 'future2 結(jié)束了';
    });
  }
}

 //打印結(jié)果
開始 future1
一千年過去了
future1 結(jié)束了
開始 future2
繼續(xù) future2
future2 結(jié)束了

實驗結(jié)果:

  • 從打印結(jié)果上看,future任務沒有中斷,執(zhí)行完當前任務后才可執(zhí)行隊列中的下一個future

實驗寫法二:

main() {
  Test2.future1().then((value) => print(value));
  Test2.future2().then((value) => print(value));
}
abstract class Test2 {
  static Future<String> future1() async {
    print('開始 future1');
    await TestTool.timeConsume(1000000000);//耗時運算
    print('一千年過去了');
    return 'future1 結(jié)束了';
  }
  static Future<String> future2() async {
    print('開始 future2');
    await TestTool.timeConsume(1000);//耗時運算
    print('繼續(xù) future2');
    return 'future2 結(jié)束了';
  }
}

//打印結(jié)果
開始 future1
開始 future2
一千年過去了
future1 結(jié)束了
繼續(xù) future2
future2 結(jié)束了

實驗結(jié)果:

  • future2future1沒有結(jié)束前就已經(jīng)開始了任務。
  • future2會在future1任務執(zhí)行完成后響應結(jié)束,整個過程仍然保持了完成順序與加入事件隊列的順序一致性。

實驗寫法三:

main() {
  Test3.future1().then((value) => print(value));
  Test3.future2().then((value) => print(value));
}
abstract class Test3 {
  static Future<String> future1() async {
    print('開始 future1');
    await Future(() => TestTool.timeConsume(1000000000));//耗時運算
    print('一千年過去了');
    return 'future1 結(jié)束了';
  }
  static Future<String> future2() async {
    print('開始 future2');
    await TestTool.timeConsume(1000);//耗時運算
    print('繼續(xù) future2');
    return 'future2 結(jié)束了';
  }
}

//打印結(jié)果
開始 future1
開始 future2
繼續(xù) future2
future2 結(jié)束了
一千年過去了
future1 結(jié)束了

實驗結(jié)果:

  • 從打印結(jié)果上看,future1開始后,future2直接開始任務,且future2任務完成后直接標識完成。
  • future1future2 的完成順序已經(jīng)和加入事件隊列的順序無關了,只與內(nèi)部耗時正相關。

附上耗時代碼:

abstract class TestTool {
  ///耗時操作
  static Future<int> timeConsume(int num) async {
    final result = _timeConsume(num);
    return result;
  }
  static int _timeConsume(int num) {
    int count = 0;
    while (num > 0) {
      if (num % 2 == 0) {
        count++;
      }
      num--;
    }
    return count;
  }
}

論證結(jié)論

綜合上述三種寫法分析:

future方法體內(nèi)部不屬于可靠的'原子性操作',不同的寫法有不同的差異性。 如果想將整個方法體內(nèi)部作為不可拆分的執(zhí)行單位。在外層使用Future進行包裹處理,如寫法一中Test1示例:

static Future<T> funcName() async {
  return Future(() async {
    ...
    具體的方法體內(nèi)容
    ...
    return result;
  });
}

future在創(chuàng)建的同時,就會被加入到event事件隊列中。事件隊列是依次執(zhí)行的,但每個future的完成順序與加入的順序不存在可靠的一致性。 如果在業(yè)務內(nèi)想保持順序的一致性,可參考上述寫法,或使用 await 進行強制等待如:

main() async {
  await Test2.future1().then((value) => print(value));
  Test2.future2().then((value) => print(value));
}

這樣寫,future2 就一定會在 future1 執(zhí)行完成后才進入開始狀態(tài)。

以上就是Dart多個future隊列完成加入順序關系及原子性論證的詳細內(nèi)容,更多關于Dart多個future原子性的資料請關注腳本之家其它相關文章!

相關文章

  • Dart?異步編程生成器及自定義類型用法詳解

    Dart?異步編程生成器及自定義類型用法詳解

    這篇文章主要為大家介紹了Dart?異步編程生成器及自定義類型用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Flutter入門學習Dart語言變量及基本使用概念

    Flutter入門學習Dart語言變量及基本使用概念

    這篇文章主要為大家介紹了Flutter入門學習Dart語言變量及基本使用概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Flutter學習筆記(二)創(chuàng)建一個flutter項目

    Flutter學習筆記(二)創(chuàng)建一個flutter項目

    這篇文章主要介紹了Flutter學習筆記(二)創(chuàng)建一個flutter項目,其中運行的過程,可能涉及到網(wǎng)絡環(huán)境配置的問題,需要的朋友可以參考下
    2023-04-04
  • 淺析Dart語言的異步處理

    淺析Dart語言的異步處理

    Dart是一個單線程語言,我們在處理耗時操作的時候使用stream或者future來實現(xiàn),在這篇文章中我們將簡單的給大家聊一聊Dart語言的異步處理
    2023-06-06
  • 一文詳解Dart如何實現(xiàn)多任務并行

    一文詳解Dart如何實現(xiàn)多任務并行

    這篇文章主要為大家介紹了Dart如何實現(xiàn)多任務并行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Flutter 語法進階抽象類和接口本質(zhì)區(qū)別詳解

    Flutter 語法進階抽象類和接口本質(zhì)區(qū)別詳解

    這篇文章主要為大家介紹了Flutter 語法進階抽象類和接口本質(zhì)區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實例詳解

    Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實例詳解

    這篇文章主要為大家介紹了Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Dart?String字符串的常用方法總結(jié)概述

    Dart?String字符串的常用方法總結(jié)概述

    這篇文章主要為大家介紹了Dart?String字符串的常用方法概述,總結(jié)整理了大概4000多字,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Flutter學習筆記(三)RowColum布局

    Flutter學習筆記(三)RowColum布局

    這篇文章主要介紹了Flutter學習筆記(三)RowColum布局,通俗來說,就是橫向布局和縱向布局的用法,需要的朋友可以參考下
    2023-04-04
  • Flutter學習筆記(一)配置環(huán)境

    Flutter學習筆記(一)配置環(huán)境

    這篇文章主要介紹了Flutter學習筆記(一)配置環(huán)境,Flutter?app使用了?Dart語言,源自于?Google,現(xiàn)在是?ECMA?的標準,需要的朋友可以參考下
    2023-04-04

最新評論

临沂市| 大竹县| 北安市| 漳平市| 綦江县| 开化县| 天水市| 澄迈县| 澄迈县| 固阳县| 巴楚县| 兴文县| 会理县| 特克斯县| 西贡区| 利辛县| 甘德县| 新巴尔虎右旗| 台中县| 临汾市| 安康市| 中西区| 天长市| 保亭| 永善县| 宜州市| 乐业县| 永济市| 西畴县| 河南省| 扬中市| 阜康市| 宁国市| 喀喇| 资兴市| 汽车| 濉溪县| 芜湖县| 横峰县| 永州市| 牟定县|