多線程(三)

下面主要介紹一下GCD(Grand Central Dispatch)的一般用法,理解好的話對以後的多線程開發是非常有幫助的。

個人認爲GCD有兩大優點

優點一、自動管理線程的生命週期(創建、調度、銷燬)
優點二、合理利用CPU內核,達到物盡其用。

核心概念

概念一、任務:執行什麼操作 (dispatch_sync:同步,不具備開啓線程的能力         dispatch_async: 異步,具備開啓線程的能力)
概念二、隊列:存放任務(併發隊列:多個任務可以同時執行           串行隊列:一個任務執行完畢後,再執行下一個任務)

其實,我們但凡用到多線程都希望其具備開啓線程的能力,並且不在主線程中操作。(純屬個人理解)一般會用到下面幾種方法。

下面的方法偶爾會用到

/**
 *  async -- 串行隊列(有時候用)
 *  會不會創建線程:會,一般只開1條線程
 *  任務的執行方式:串行執行(一個任務執行完畢後再執行下一個任務)
 */
- (void)asyncSerialQueue
{
    // 1.創建一個串行隊列
    dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
    
    // 2.將任務添加到串行隊列中 異步 執行
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
    });

}

下面方法常用

/**
 *  async -- 主隊列(很常用)
 */
- (void)asyncMainQueue
{
    // 1.主隊列(添加到主隊列中的任務,都會自動放到主線程中去執行)
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    // 2.添加 任務 到主隊列中 異步 執行
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
    });
}

下面方法最常用,(如我的想法理解一樣)

/**
 *  async -- 併發隊列(最常用)
 *  會不會創建線程:會,一般同時開多條
 *  任務的執行方式:併發執行
 */
- (void)asyncGlobalQueue
{
    // 獲得全局的併發隊列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    // 將 任務 添加 全局隊列 中去 異步 執行
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片3---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片4---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"-----下載圖片5---%@", [NSThread currentThread]);
    });
}



發佈了64 篇原創文章 · 獲贊 10 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章