ios中我們常使用dispatch_queue和nsoperationqueue來實現多執行緒。而序列和並行、同步和非同步,這四個詞同時出現的地方是dispatch_queue。nsoperationqueue貼心的隱藏了這些東西,已經不需要我們來操心了。所以下面會使用dispatch_queue來展開。
執行緒,執行緒是程式執行流的最小單元。
序列佇列,後乙個任務等待前一任務結束後再執行,按新增順序乙個乙個執行。
並行佇列,後乙個任務不會等待前乙個任務,不等前乙個任務完成就會分配新任務。
序列和並行,這裡對應的是佇列的概念。佇列負責管理多個任務,佇列擁有乙個執行緒池,池子裡有乙個或者多個執行緒,它按要求將每個任務排程到某乙個執行緒執行。
拋開同步非同步,首先來建立乙個佇列 dispatch_queue_t ,dispatch_queue_serial、
dispatch_queue_concurrent
分別對應序列和並行
dispatch_queue_t serialqueue = dispatch_queue_create("my.serialqueue", dispatch_queue_serial);
dispatch_queue_t concurrentqueue = dispatch_queue_create("my.concurrentqueue", dispatch_queue_concurrent);
然後再來說一下dispatch_sync
和dispatch_async
。同步和非同步在這裡是執行緒概念,同步不會建立新的執行緒,會阻塞當前的執行緒在這個執行緒裡執行任務。而非同步則不會阻塞當前執行緒,會選擇在恰當的時機在當前執行緒或者另開執行緒執行任務(看系統如何排程),開始任務和完成任務時間是不確定的。
在viewdidload裡加新增**run
首先看到viewdidload是mainqueue來排程來的任務,而mainqueue是序列的(serial)。
這裡不能使用dispatch_sync(main,^{});序列佇列同步任務中(向同乙個序列佇列新增同步任務),進行中的任務等待新增任務完成,新增的任務等待上乙個任務完成,因為相互等待死迴圈。在currentqueue中謹慎使用dispatch_sync;
因為是同步,任務都被分配到了主線程,同步任務會阻塞當前執行緒,所以順序一定是1234。
再把serialqueue換成concurrentqueue,依然用sync同步,得到的結果是1234。同步只會在當前執行緒(只有乙個執行緒)同時阻塞執行緒,並行佇列失去意義,結果和序列佇列一樣都是乙個乙個順序執行。
上述**,我們將sync換成async非同步,依然是serialqueue序列佇列。得到結果2413、2143、1234。
序列佇列,乙個乙個執行,
那麼1肯定在3前面。而非同步操作不會阻塞執行緒,1、3和2、4之間的位置是不確定的;另外補充,序列非同步情況下,序列乙個乙個執行,那麼非同步一次分配乙個執行緒就足夠了(佇列可以把任務提交到不同的執行緒,但序列同時存在的只有乙個任務也就是乙個執行緒)。
上述**,換成非同步並行
可見因為非同步,1、3分別被分配到了執行緒thread 5、4中執行,(具體分配到哪個執行緒是不確定的)。
得到結果可能是13,也可能是31,因為是並行佇列,不會等待上乙個任務完成,非同步的執行又是不確定時間的,所以1和3的順序是不確定的。
多執行緒中同步和非同步?
執行緒同步 多個執行緒同時訪問同一資源,等待資源訪問結束,浪費時間,效率低 執行緒非同步 訪問資源時在空閒等待時同時訪問其他資源,實現多執行緒機制 非同步處理就是,你現在問我問題,我可以不回答你,等我用時間了再處理你這個問題.同步不就反之了,同步資訊被立即處理 直到資訊處理完成才返回訊息控制代碼 非...
執行緒同步和非同步
執行緒同步和執行緒非同步有什麼區別?重要基礎知識 打個比方,如果你在等乙個人,同步的時候,你會一直等到她來了之後才做其他事情,這個過程除了等待你啥都不會做,非同步的時候,你一邊在等,可能一邊玩遊戲或者是看報紙什麼的,一直到她到來,你的等待狀態才會結束 在實現上,同步的過程會阻塞程序的所有其他操作,將...
執行緒同步和非同步
執行緒同步 是多個執行緒同時訪問同一資源,等待資源訪問結束,浪費時間,效率低 執行緒非同步 訪問資源時在空閒等待時同時訪問其他資源,實現多執行緒機制 非同步處理就是,你現在問我問題,我可以不回答你,等我用時間了再處理你這個問題.同步不就反之了,同步資訊被立即處理 直到資訊處理完成才返回訊息控制代碼 ...