iOS中常見的線程-隊列 與線程的關係

大佬說我要學會總結,因此最近就會把以前項目中的狀況,總結拓展下:bash

在開發過程當中常常用到隊列和線程結合使用,給隊列中添加任務有四種使用方法:串行隊列中執行同步任務、串行隊列中執行異步任務、併發隊列中執行同步任務、併發隊列中執行異步任務,還有主隊列,下面先說下主隊列併發

##主隊列異步

dispatch_get_main_queue() 常見的宏定義 解釋: 主隊列:專門負責調度主線程度的任務,沒有辦法開闢新的線程。因此,在主隊列下的任務無論是異步任務仍是同步任務都不會開闢線程,任務只會在主線程順序執行。async

1 . 主隊列異步任務spa

主隊列中放入異步任務,不是立刻執行,而是等到主隊列中的其它全部除咱們使用代碼添加到主隊列的任務都執行完畢以後,纔會執行咱們使用代碼添加的任務。 例如線程

NSLog(@"------------------1");
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"主隊列異步 %@",[NSThread currentThread]);
    });
    NSLog(@"------------------2");

複製代碼

執行結果:code

------------------1
 ------------------2
主隊列異步   <NSThread: 0x100e06230>{number = 1, name = main}
複製代碼

2 . 主隊列同步任務 容易阻塞主線程,由於代碼任務須要立刻執行,可是主線程正在執行代碼任務的方法體,所以代碼任務就必須等待,而主線程又在等待代碼任務的完成好去完成下面的任務,所以就造成了相互等待,形成了死鎖隊列

// 主隊列同步
    NSLog(@"------------------1");
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"主隊列同步 %@",[NSThread currentThread]);
    });
    NSLog(@"------------------2");

複製代碼

二 . 串行隊列開發

1 . 串行隊列執行同步任務get

在主線程中依次執行任務,不會開啓新線程

dispatch_queue_t queue =dispatch_queue_create("jz",DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }
    });
複製代碼

執行結果是依次執行順序內容

2 . 串行隊列執行異步任務

在主線程以外新建一個線程,在新建的線程中依次執行任務

dispatch_queue_t queue =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }
    });
複製代碼

執行的結果依然是依次執行

三 . 併發隊列

1 . 併發隊列執行同步任務

主線程中依次執行任務,不會開啓新線程

dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }
    });

複製代碼

//併發隊列 同步進行 依次打印線程

2 . 併發隊列執行異步任務

三個任務同時執行

dispatch_queue_t queue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task1------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task2------%@", [NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i =0; i <3; i ++) {
            NSLog(@"task3------%@", [NSThread currentThread]);
        }

--------------------- 
複製代碼

併發隊列 異步進行 就發現線程已經不是同步順序了,打印內容是 都在處理線程任務

在業務使用中,大部分使用的就是異步線程去執行相應的業務,因此使用的過程當中 日常注意FIFO的原則 以及 可能會形成的死鎖等問題

相關文章
相關標籤/搜索