iOS詳解 GCD 序列佇列並行佇列
// 序列佇列 分兩種 // 1.主佇列 // 建立一個主佇列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); // 像主佇列中新增任務 // 引數1 要新增的佇列 // 引數2 要新增的任務 dispatch_async(mainQueue, ^{ NSLog(@"第一個任務,所線上程:%@, 是否是主執行緒:%d", [NSThread currentThread], [NSThread currentThread].isMainThread); }); dispatch_async(mainQueue, ^{ NSLog(@"第二個任務,所線上程:%@, 是否是主執行緒:%d", [NSThread currentThread], [NSThread currentThread].isMainThread); }); dispatch_async(mainQueue, ^{ NSLog(@"第三個任務,所線上程:%@, 是否是主執行緒:%d", [NSThread currentThread], [NSThread currentThread].isMainThread); }); // 任務延遲 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(33 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"延遲3秒執行"); }); // ull 是C語言的數值字面量 相當於 unsigned long long dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 55ull * NSEC_PER_SEC), mainQueue, ^{ NSLog(@"延遲5秒執行"); }); // 綜上:序列主佇列 都在主線衝中進行任務 結束一個 才能進入下一個 [objc] view plaincopy // 2.自定義佇列 // 建立一個佇列 // 引數1 自定義佇列的標示符 名字 // 引數2 自定義佇列的種類 序列 dispatch_queue_t myQueue = dispatch_queue_create("com.wl.MyQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(myQueue, ^{ for (int i = 0; i < 10; i++) { NSLog(@"第一個任務,所線上程:%@, 是否是主執行緒:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i); } }); dispatch_async(myQueue, ^{ for (int i = 10; i < 20; i++) { NSLog(@"第二個任務,所線上程:%@, 是否是主執行緒:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i); } }); dispatch_async(myQueue, ^{ for (int i = 20; i < 30; i++) { NSLog(@"第三個任務,所線上程:%@, 是否是主執行緒:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i); } }); [objc] view plaincopy // 建立一個 並行佇列 // 引數1 設定優先順序 無優先順序 // 引數2 預留引數 一般給0 // dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // dispatch_async(myQueue, ^{ // for (int i = 0; i < 10; i++) { // NSLog(@"第一個任務,所線上程:%@, 是否是主執行緒:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i); // } // }); // dispatch_async(myQueue, ^{ // for (int i = 10; i < 20; i++) { // NSLog(@"第二個任務,所線上程:%@, 是否是主執行緒:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i); // } // }); // dispatch_async(myQueue, ^{ // for (int i = 20; i < 30; i++) { // NSLog(@"第三個任務,所線上程:%@, 是否是主執行緒:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i); // } // }); // 2.自定義佇列,需要自己手動建立,並設定佇列為並行 dispatch_queue_t myQueue = dispatch_queue_create("com.lanou3g.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(myQueue, ^{ for (int i = 0; i < 10; i++) { NSLog(@"第一個任務,所線上程:%@, 是否是主執行緒:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i); } }); dispatch_async(myQueue, ^{ for (int i = 10; i < 20; i++) { NSLog(@"第二個任務,所線上程:%@, 是否是主執行緒:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i); } }); dispatch_async(myQueue, ^{ for (int i = 20; i < 30; i++) { NSLog(@"第三個任務,所線上程:%@, 是否是主執行緒:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i); } }); [objc] view plaincopy // 分組佇列 - (void)group { // 建立分組 dispatch_group_t group = dispatch_group_create(); // 建立並行佇列(全域性佇列) dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 把myQueue新增到分組group中,並且給myQueue新增任務 dispatch_group_async(group, myQueue, ^{ for (int i = 0; i < 10; i++) { NSLog(@"第一個任務,所線上程:%@, 是否是主執行緒:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i); } }); dispatch_group_async(group, myQueue, ^{ for (int i = 10; i < 20; i++) { NSLog(@"第二個任務,所線上程:%@, 是否是主執行緒:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i); } }); // 在分組所有任務執行完成之後,最後指向下面的任務 dispatch_group_notify(group, myQueue, ^{ // 回到主執行緒重新整理UI dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"當前的執行緒是: %@", [NSThread currentThread]); NSLog(@"所有資料下載完成.可以去重新整理UI了"); }); }); dispatch_group_async(group, myQueue, ^{ for (int i = 20; i < 30; i++) { NSLog(@"第三個任務,所線上程:%@, 是否是主執行緒:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i); } }); } [objc] view plaincopy - (void)barrier { // 自己建立並行佇列 dispatch_queue_t queue = dispatch_queue_create("com.lanou3g.Barrier", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"玩家一讀取完成"); }); dispatch_async(queue, ^{ NSLog(@"玩家二讀取完成"); }); dispatch_async(queue, ^{ NSLog(@"玩家三讀取完成"); }); // 設定屏障 dispatch_barrier_async(queue, ^{ NSLog(@"等待其他玩家進入..."); }); // 玩家一進入遊戲 dispatch_async(queue, ^{ NSLog(@"玩家一進入遊戲"); }); // 玩家二進入遊戲 dispatch_async(queue, ^{ NSLog(@"玩家二進入遊戲"); }); // 玩家三進入遊戲 dispatch_async(queue, ^{ NSLog(@"玩家三進入遊戲"); }); dispatch_barrier_async(queue, ^{ // 回到主執行緒,更新UI dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"------%d", [NSThread currentThread].isMainThread); NSLog(@"敵軍即將在30秒後進入戰場"); }); }); } // 只執行一次 - (void)onceBlock { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"第一滴血"); }); }
相關推薦
iOS詳解 GCD 序列佇列並行佇列
// 序列佇列 分兩種 // 1.主佇列 // 建立一個主佇列 dispatch_queue_t mainQueue = dispatch_get_main_queue(); // 像主佇列中新增任務
[IOS] 詳解圖片局部拉伸 + 實現圖片局部收縮
情況 cat 寬度 cal inb 進行 圖片顯示 平鋪 length (圖為微信首頁右上角『+』效果) 當初還在開發WP7的時候,從IOS同事那邊了解到類似微信以上功能的實現。 Item條數不同,總高度也不同,這就需要將背景圖片進行局部拉伸到響應的高度,並且保持上方的三角
支援向量機—SMO論文詳解(序列最小最優化演算法)
SVM的學習演算法可以歸結為凸二次規劃問題。這樣的凸二次規劃問題具有全域性最優解,並且許多最優化演算法可以用來求解,但是當訓練樣本容量很大時,這些演算法往往變得非常低效,以致無法使用。論文《Sequential Minimal Optimization:A Fast Algori
完整詳解GCD系列(三)dispatch_group
/////-------------注意----------------這篇文章是在Swift 1.0時代寫的,已經不適合當前的語法。關於Swift最新版本的GCD,參見我的這篇部落格GCD精講/////-------------注意----------------一、dis
完整詳解GCD系列(二)dispatch_after;dispatch_apply;dispatch_
本教涵蓋的內容 一、dispatch_after 二、dispatch_apply 三、dispatch_once一、dispatch_after 功能:延遲一段時間把一項任務提交到佇列中執行,返回之後就不能取消 常用來在在主佇列上延遲執行一項任務 函式原型func dispatch_after(_ wh
GCD實踐——序列佇列/併發佇列與iOS多執行緒詳解
GCD(Grand Central Dispatch),是蘋果提供的一個解決多執行緒開發的解決方案。GCD會自動管理執行緒的生命週期(建立執行緒,排程任務,銷燬執行緒),完全不需要我們管理,我們只需要告訴幹什麼就行。同時GCD使用block來進行任務的執行,用起
iOS-GCD的序列佇列和並行佇列的任務及實現
•什麼是GCDGCD全稱是GrandCentral Dispatch,純C語言的,提供了非常多強大的函式 •GCD的優勢 1,GCD是蘋果公司為多核的並行運算提出的解決方案 2,GCD會自動利用更多的
GCD使用 序列並行佇列 與 同步非同步執行的各種組合 及要點分析
0、概要 1、非同步函式和並行佇列 注意:這些任務都是在建立完之後才執行的。非同步函式+併發佇列,可以新建執行緒,各執行緒也是併發執行的。 2、同步函式+併發佇列 注意:這些任務都是建立一
iOS-多執行緒程式設計學習之GCD——序列佇列和併發佇列(五)
Grand Central Dispatch(GCD)有很多部分構成,例如有很好的語言特性,執行庫,還提供了系統的、高效的方式來支援具有多核處理器的iOS和OS X裝置進行併發事件處理。 BSD子系統,CoreFoundation和Cocoa APIs
三、執行緒安全阻塞佇列 BlockingQueue 詳解
轉載自: https://www.cnblogs.com/WangHaiMing/p/8798709.html 本篇將詳細介紹BlockingQueue,以下是涉及的主要內容: BlockingQueue的核心方法 阻塞佇列的成員的概要介紹 詳細介紹DelayQu
優先佇列——Priority_Queue 詳解
一、入門介紹 1、 優先佇列是一種特殊的佇列,這種佇列會自動的把佇列裡的數排序(預設從大到小,使用“<”判斷),而且還可以把數按照特定的方法排列!(包括結構體和過載"<") 2、 優先佇列的標頭檔案,需要包括: #include<queue> using na
工作佇列詳解
1.工作佇列的建立 INIT_WORK(&work_demo, work_demo_func); workqueue_demo = create_singlethread_workqueue("workqueue demo"); queue_work(workqueue_demo
詳解兩個佇列實現一個棧(python實現——經典面試題)
1、任務詳解 使用兩個佇列資料結構實現一個棧,要求實現棧的出棧和進棧操作。 2、解題思路 push()操作: 為了保證先進
詳解兩個棧實現一個佇列(python實現——經典面試題)
1、題目說明 使用兩個棧結構,實現一個佇列功能,實現佇列的新增元素和彈出元素。 注意: 佇列特點是隻能在佇列尾部新增元素,在佇列頭部刪除元素,先進先出(FIFO/
優先佇列詳解
說到佇列,我們首先想到就是先進先出,後進後出;那麼何為優先佇列呢,在優先佇列中,元素被賦予優先順序,當訪問元素時,具有最高階優先順序的元素先被訪問。即優先佇列具有最高階先出的行為特徵。 優先佇列在標頭檔案#include <queue>中; 其宣告格式為:pri
【小家java】BlockingQueue阻塞佇列詳解以及5大實現(ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue...)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
【python】詳解queue佇列
一、佇列的定義 佇列類似於一條管道,元素先進先出,進put(arg),取get( )。需要注意的是:佇列都是在記憶體中操作,程序退出,佇列清空,另外,佇列也是一個阻塞的形態。 二、佇列分類 佇列有很多種,但都依賴模組queue 佇列方式
優先佇列詳解(轉載)
優先佇列:顧名思義,首先它是一個佇列,但是它強調了“優先”二字,所以,已經不能算是一般意義上的隊列了,它的“優先”意指取隊首元素時,有一定的選擇性,即根據元素的屬性選擇某一項值最優的出隊~ 百度百科上這樣描述的: 優先順序佇列 是不同於先進先出佇列的另一種佇列。每次從佇列中取出的是具有最高優先權的元
中斷底半部機制之工作佇列詳解
工作佇列的使用方法和tasklet 非常相似,下面的程式碼用於定義一個工作佇列和一個底半部執行函式。 struct work_struct my_wq; /*定義一個工作佇列*/ void my_wq_func(unsigned long); /*定義一個處理函式*/ 通過INIT_W
Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解
阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者