<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Dart 是一個在單執行緒中執行的程式。在程式中執行一個需要長時間的執行的操作,為避免卡住UI主執行緒,我們會用到非同步(future),可以使程式在等待一個耗時操作完成時繼續處理其他工作。
在進入正題之前,我們先了解一下 Dart 的訊息迴圈機制:
Future 是什麼?這裡我們用小篇幅簡單描述一下。future是一個非同步的執行操作,可以在不阻塞程式碼的情況下實現耗時功能。
main() { Future(() { print('我是一個耗時操作'); }).then((value){ print('future 結束了'); }); print('main'); }
//列印結果
main
我是一個耗時操作
future 結束了
在專案中,我們使用 Future
、Async
、await
相互組合實現非同步編碼。
上面的篇幅我們說過,future 建立後會被直接加入到事件佇列依次執行。那麼在上一個 future 在沒有標識完成前,下一個 future 可以被執行嗎?
小編寫了幾個樣例來做實驗:
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 結束了'; }); } static Future<String> future2() async { return Future(() async { print('開始 future2'); await TestTool.timeConsume(1000); //耗時運算 print('繼續 future2'); return 'future2 結束了'; }); } }
//列印結果
開始 future1
一千年過去了
future1 結束了
開始 future2
繼續 future2
future2 結束了
實驗結果:
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 結束了'; } static Future<String> future2() async { print('開始 future2'); await TestTool.timeConsume(1000);//耗時運算 print('繼續 future2'); return 'future2 結束了'; } }
//列印結果
開始 future1
開始 future2
一千年過去了
future1 結束了
繼續 future2
future2 結束了
實驗結果:
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 結束了'; } static Future<String> future2() async { print('開始 future2'); await TestTool.timeConsume(1000);//耗時運算 print('繼續 future2'); return 'future2 結束了'; } }
//列印結果
開始 future1
開始 future2
繼續 future2
future2 結束了
一千年過去了
future1 結束了
實驗結果:
附上耗時程式碼:
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; } }
綜合上述三種寫法分析:
future方法體內部不屬於可靠的'原子性操作',不同的寫法有不同的差異性。 如果想將整個方法體內部作為不可拆分的執行單位。在外層使用Future進行包裹處理,如寫法一中Test1範例:
static Future<T> funcName() async { return Future(() async { ... 具體的方法體內容 ... return result; }); }
future在建立的同時,就會被加入到event事件佇列中。事件佇列是依次執行的,但每個future的完成順序與加入的順序不存在可靠的一致性。 如果在業務內想保持順序的一致性,可參考上述寫法,或使用 await
進行強制等待如:
main() async { await Test2.future1().then((value) => print(value)); Test2.future2().then((value) => print(value)); }
這樣寫,future2 就一定會在 future1 執行完成後才進入開始狀態。
以上就是Dart多個future佇列完成加入順序關係及原子性論證的詳細內容,更多關於Dart多個future原子性的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45