GCD多线程

2016-03-08  本文已影响0人  仙小剑

一、概念介绍

-任务:要执行的操作,在GCD中一般为block
-队列:用来存放任务,在GCD中成为queue
-并发队列:可以让多个任务并发执行
-串行队列:任务只能一个接一个地执行

二、GCD的使用

1.队列的创建

//用来创建串行队列或者并行队列
dispatch_queue_t 
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
//用来获得系统提供的全局并发队列
dispatch_queue_t
dispatch_get_global_queue(long identifier, unsigned long flags);
//用来获取系统提供的主队列,主队列的任务只在主线程执行
dispatch_queue_t
dispatch_get_main_queue(void);

2.将任务添加到队列中
任务被添加到队列中后,会被自动取出执行。添加任务到队列主要有同步和异步两种。

//以异步的方式添加任务,函数立即返回,执行函数后面的代码。第一个参数是队列,第二个参数是要执行的block
void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
//以同步的方式添加任务,函数要等block执行完才能执行函数后面的代码
void
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

3.各种队列的执行结果
并发队列,以异步的方式添加任务,可能开启多条线程

//两个任务在不同线程执行
- (void)concurrentQueueAsync{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
        }
    });
}

串行队列,以异步的方式添加任务 ,开启一条线程

//任务按顺序执行,且任务不在主线程执行
- (void)serialQueueAsync{
    dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
        }
    });
}

并发队列,以同步的方式添加任务,不开线程

//任务按顺序执行,并且任务都在主线程执行
- (void)concurrentQueueSync{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
        }
    });
}

串行队列,以同步的方式添加任务, 不开线程

//任务按顺序执行,并且任务都在主线程执行
- (void)serialQueueSync{
    dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第一个任务%d,%@",i,[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        for (int i = 0; i < 10; i++) {
            NSLog(@"第二个任务%d,%@",i,[NSThread currentThread]);
        }
    });
}

主队列,以异步的方式添加任务,任务在主线程执行。
主队列,以同步的方式添加任务,造成死循环。
原因:dispatch_sync函数在等待任务执行完才能返回,而任务被添加在主队列,也就是任务要等待函数返回了才能执行,相互等待。。。

上一篇 下一篇

猜你喜欢

热点阅读