天天看點

GCD中的隊列與任務組合對比

  • 在GCD隊列中,隊列的類型不是決定是否開啟線程的
  • 隊列的類型是決定排程方式的
    • 串行隊列:每次隻排程一個任務,也可以開啟子線程
    • 并行隊列:每次可排程多個任務,一定可以開啟子線程
  • 串行隊列的排程方式決定了它開啟再多的線程也沒有用,是以隻有當它遇到異步任務的時候才會新開一個線程,因為他的排程方式決定了他開一個就夠了
  • 決定是否開啟線程:
    • 同步任務:不開線程,并且無論在串行還是并行隊列中都有序執行
    • 異步任務:開線程 ,隻能在并行隊列中亂序執行
"串行隊列:我同時隻能排程一個任務诶...雖然我也能開啟子線程,但我就能排程一個任務....."
"同步任務:沒關系啊,我本來就是一個一個被排程執行的呢"
"串行對列:這樣喔...那我們就不用開線程了呢,按順序執行就好了~"
#pragma mark - 串行隊列 + 同步任務
// 不開線程(同步任務隻在目前線程執行)
// 順序執行(串行隊列是按順序排程任務執行的,而且任務又是同步任務)
- (void)GCDDemo
{
    // 1.建立串行隊列
    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_SERIAL);

    // 循環的把多個同步任務添加到串行隊列
    for (NSInteger i = 0; i < 10; i++) {
        // 2.把同步任務添加到串行隊列
        dispatch_sync(queue, ^{
            NSLog(@"%zd %@",i,[NSThread currentThread]);
        });
    }

    NSLog(@"不開線程,任務依次在目前線程執行");
 }           
"串行隊列:我同時隻能排程一個任務诶...雖然我也能開啟子線程,但我就能排程一個任務....."
"異步任務:不行,我就要開線程,媽媽說我是可以被多個同時排程的,我要在子線程執行!!!"
"串行對列:好吧,那我就給你開一個子線程吧,開多了也沒用呢,因為我隻能同時排程一個任務哦"
"異步任務:好吧好吧,那你就開一個子線程吧"
#pragma mark - 串行隊列 + 異步任務
// 開線程,隻開一個子線程,一個就夠了
// 順序執行,(串行隊列是按順序排程任務執行的)
- (void)GCDDemo
{
    // 1.建立串行隊列
    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_SERIAL);

    for (NSInteger i = 0; i < 10; i++) {
        // 2.把異步任務添加到串行隊列
        dispatch_async(queue, ^{
            NSLog(@"%zd %@",i,[NSThread currentThread]);
        });
    }

    NSLog(@"在一個新的子線程執行,并且有序執行");
}

           

在GCD的隊列和任務中

當隊列是并行隊列時:

- 任務是同步的,那麼任務一定是同步執行的,并且不開線程(按順序執行,FIFO)

- 任務是異步的時候,任務才會異步執行,開啟多個線程

"并行隊列:我可以同時排程多個任務,是以能開多個線程哦!"
"同步任務:不,我就要一個一個排程執行"
"并行隊列:哦,好吧,那我不開線程了,浪費...就用一個主線程吧"
#pragma mark - 并行隊列 + 同步任務
// 不開線程(任務是同步的)
// 有序(任務是同步的,隊列遵守FIFO)
- (void)GCDDemo
{
    // 1.建立并行隊列
    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_CONCURRENT);

    for (NSInteger i = 0; i < 10; i++) {
        // 2.把同步任務添加到并行隊列
        dispatch_sync(queue, ^{
            NSLog(@"%zd %@",i,[NSThread currentThread]);
        });
    }

    NSLog(@"不開線程,任務依次執行");
}           
"并行隊列:我可以同時排程多個任務,是以能開多個線程哦!"
"異步任務:好啊好啊,我正好着急,想多個任務一起執行呢"
"并行隊列:來吧,我要開啟多個線程了,但是不能保證順序哦..而且主線程不算我的子線程範圍呢"
"異步任務:沒關系,我不在乎順序,能完成就好"
#pragma mark - 并行隊列 + 異步任務
// 開線程
// 任務無序
- (void)GCDDemo
{
    // 1.建立并行隊列
    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_CONCURRENT);

    for (NSInteger i = 0; i < 10; i++) {
        // 2.把異步任務添加到并行隊列
        dispatch_async(queue, ^{
            NSLog(@"%zd %@",i,[NSThread currentThread]);
        });
    }

    NSLog(@"開啟新線程,任務是無序的");
}

           

繼續閱讀