一:主队列

1.概念:每一个应用程序对应唯一一个主队列,直接GET即可;在多线程开发中,使用主队列更新UI

        dispatch_queue_t q = dispatch_get_main_queue();

2.特性:首先是一个程序里只有唯一一个主队列,专门负责调度主线程里的任务,不会允许开辟新的线程。主队列也是串行队列。

比如在主队列中的异步任务,虽然是异步的,但任务们最终都只在主线里执行,代码如下:

- (void)test5{
    // 获得主队列(每一个应用程序中对应唯一一个主队列)
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"开始!!");
    for (int i = 0 ; i < 10; i ++) {
        dispatch_async(queue, ^{
            NSLog(@"当前操作咋%@线程 ---  任务号 = %d",[NSThread currentThread],i);
        });
    }
    NSLog(@"结束");
    
}

打印结果:

2016-01-17 22:14:04.658 wdqdqw[14457:1222706] 开始!!

2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 结束

2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 0

2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 1

2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 2

2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 3

2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 4

2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 5

2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 6

2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 7

2016-01-17 22:14:04.686 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 8

2016-01-17 22:14:04.686 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 ---  任务号 = 9

  会发现一个很有意思的现象,只有在test5这个函数执行完毕后,才会调用任务里的内容(也就是block里的内容),原因如下:

    一个线程只能同时执行一个任务,当前主线程在异步任务被放进主队列里后,由于是异步任务,不会立马执行,就会先执行test5这个函数,等函数执行完毕了,主线程才会继续执行主队列里的任务,于是出现了上面的 先打印”开始“”结束“在打印任务号等等。

  需要注意的是,如果吧上面的任务改为同步任务,也就是说需要立马执行,那么主线程就会阻塞。原因如下:

    如果是同步任务,那么队列里的任务就需要立马到主线里去执行。但是由于主线程里的test5还没执行完,同步任务就会没法到主线程里去。而test5又必须等同步任务执行完(同步任务必须立即被执行),他才会能执行完毕,所以造成了死锁,堵塞了主线程。

二:全局队列

1.概念:是一个并行队列 ,与主队列类似,使用get方法即可获得

dispatch_get_global_queue;

2.特性:与创建的并行队列相比较:

2.1.全局队列没有名称,但创建的有。

2.2.全局队列是所有程序共享的。

2.3.在MRC中,并行队列需要手动释放,而全局队列不需要。