GCD-异步全局队列

本文探讨了Grand Central Dispatch (GCD) 中的异步任务和全局队列。异步任务可以在多线程环境中并发执行,而队列分为并发和串行。全局队列支持多线程,允许异步任务并行处理,而主队列则按顺序执行任务。通过代码示例展示了在全局并发队列中,多个异步任务会并发执行,导致输出顺序不确定性;而在同一个异步任务内的循环,则不会产生这种并发行为。
摘要由CSDN通过智能技术生成

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

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

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个异步任务同时执行,第二段代码有一个异步任务.

嗯…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值