1. 程式人生 > >iOS詳解 GCD 序列佇列並行佇列

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)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者