GCD-异步全局队列

来源:互联网 发布:mysql的全文索引 编辑:程序博客网 时间:2024/04/29 19:40

异步: 表示的是任务,任务有同步和异步,异步任务是可以同时执行的,同步反之
队列: 表示的是是否开启多线程.队列有并发和串行,并发里的异步任务是可以同时执行的,串行队列里无论是异步还是同步任务都是依次执行的.

多个任务,如果想要同时执行,那么需要两个条件,一是设为异步,表示该任务可以同时执行.还需要加入到队列当中.
队列有全局队列和主队列,全局队列表示可以开辟多个线程,来供异步任务同时执行,而主队列只能让异步任务依次执行,也就无法同时执行了.

so…
我们看两段代码来理解一下:

//这里主要写异步任务+全局队列    for (NSInteger i = 0; i < 10; ++i) {        dispatch_async(dispatch_get_global_queue(0, 0), ^{            NSLog(@"%zd -- %@", i, [NSThread currentThread]);        });    }//输出: 2016-12-21 21:31:41.085 GCD的探索[65996:2385901] 0 -- <NSThread: 0x600000263680>{number = 4, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385919] 2 -- <NSThread: 0x600000263740>{number = 6, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385899] 1 -- <NSThread: 0x6000002637c0>{number = 5, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385920] 3 -- <NSThread: 0x600000263800>{number = 7, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385915] 4 -- <NSThread: 0x600000263700>{number = 8, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385901] 5 -- <NSThread: 0x600000263680>{number = 4, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385919] 6 -- <NSThread: 0x600000263740>{number = 6, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385920] 8 -- <NSThread: 0x600000263800>{number = 7, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385899] 7 -- <NSThread: 0x6000002637c0>{number = 5, name = (null)}2016-12-21 21:31:41.085 GCD的探索[65996:2385921] 9 -- <NSThread: 0x6080002788c0>{number = 9, name = (null)}

上面这段代码可以清晰的看到for循环了十次,但是输出的内容却不是从0-9依次输出的,而是0,2,1,3.
然而这说明了什么?
这说明了for循环了十次,有十个输出语句,这十个输出语句每个都做为一个异步的任务,加入到了dispatch_get_global_queue(0, 0)该全局队列,也称为并发队列.并发队列可以让异步任务同时执行.所以我们可以看到输出0后,紧跟着输出了2,就好比0到9,这十个数字在进行百米赛跑一样,0先跑到终点,紧跟着2也跑到了终点,然后是1等等等..

那么我们再看下面一段代码:

//同样是一异步任务+全局队列.    dispatch_async(dispatch_get_global_queue(0, 0), ^{        for (NSInteger i = 0; i < 10; ++i) {            NSLog(@"%zd -- %@", i, [NSThread currentThread]);        }    });

这段代码与第一段有点小小的差异.在block中写了一个for循环,那么会不会像第一段代码那样不按顺序输出呢?答案是不会….为什么呢?因为该for循环作为一个异步任务加到了并发队列,而第一段代码是每个输出语句作为一个异步任务,即: 第一段代码有10个异步任务同时执行,第二段代码有一个异步任务.

嗯…

0 0