GCD使用基础 一
2017-08-22 本文已影响5人
皓皓大帝
概念
串行队列:前一个执行完毕才会执行下一个。就像是只有一个窗口的收费站,轮流对车收费放行,后面的车只能等待前面的车通过,才能前行。(例:主队列)
串行队列并行队列:后面的任务可以选择其他的途径执行。就像是有多个窗口的收费站,后面的车辆可以选择去其他的窗口排队通过。(例:全局队列)
并行队列同步任务:执行完函数,需要等待返回结果,才可以继续往下执行,会阻塞当前线程。
异步任务:执行完函数,不需要等待返回结果,就可以继续往下执行,不会产生阻塞。
串行队列&同步任务
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
NSLog(@"同步任务1,%@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"同步任务2,%@", [NSThread currentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"同步任务3,%@", [NSThread currentThread]);
});
串行队列&同步任务
不创建新的线程,只在当前的线程中执行,并顺序执行!
串行队列&异步任务
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
NSLog(@"异步任务1,%@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"异步任务2,%@", [NSThread currentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"异步任务3,%@", [NSThread currentThread]);
});
串行队列&异步任务
创建新的线程,在新的线程中执行,虽然是异步任务,仍需要按进队顺序执行。
并行队列&同步任务
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(concurrentQueue, ^{
NSLog(@"同步任务1,%@", [NSThread currentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"同步任务2,%@",[NSThread currentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"同步任务3,%@",[NSThread currentThread]);
});
并行队列&同步任务
不创建新的线程,在当前线程执行,虽然是并行队列,由于同步任务的阻塞性,仍是按进队顺序执行。
并行队列&异步任务
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
NSLog(@"异步任务1,%@", [NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"异步任务2,%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"异步任务3,%@",[NSThread currentThread]);
});
并行队列&异步任务
创建新的线程执行任务,而且是并行队列,所以任务的执行相互不影响,谁先执行完毕,算谁厉害!
注释:
-
当前线程
上面说的当前线程指的是添加任务时所在的线程,不一定是在主线程(main)中,直接看代码!下面的异步任务1和同步任务1就是在同一个子线程中执行的。
dispatch_async(concurrentQueue, ^{
NSLog(@"异步任务1,%@", [NSThread currentThread]);
dispatch_async(concurrentQueue, ^{
NSLog(@"同步任务1,%@", [NSThread currentThread]);
});
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"同步任务2,%@",[NSThread currentThread]);
});
注释1
- 线程数(number)
虽然异步任务会创建新的线程,但并不是有多少异步任务就会创建多少条线程,很费电的!系统会做限制的,我们也可以根据不同的网络环境对线程数量进行限制。
上面的打印日志中,number的值不是当前存在的线程数,而是曾经创建过这么多线程,而这个任务是在这条线程执行的。线程会在其上面的任务执行完毕后销毁的,这个跟runloop就挂钩了!