进程:一个可执行的程序
任务:一块可执行的代码
线程:指的是一个独立的代码执行路径,线程是代码执行路径的最小分支
串行和并行:串行是一次只能执行一个任务,并行是一次能执行多个任务
并行是CPU的多核芯同时执行多个任务 并发是单核CPU交替执行两个任务
GCD中的dispatch queue是FIFO任务队列,一个任务可以是一个函数,也可以是一个block。
GCD即对调度队列的操作,分为两种,serial dispatch queue(连续队列、串行队列)和concurrent dispatch queue(同时发生的、并发队列)队列,正如名字,serial队列只能有一个线程,concurrent队列可以有多个线程,就是说,serial队列里的任务只能给一个线程按顺序执行,concurrent队列里的任务可以分给多个线程执行,而且,执行顺序不定。
- 串行队列:线程任务按先后顺序逐个执行(需要等待队列里面前面的任务执行完之后再执行新的任务)。
- 并发队列:多个任务按添加顺序一起开始执行(不用等待前面的任务执行完再执行新的任务),但是添加间隔往往忽略不计,所以看着像是一起执行的。
使用concurrent队列时,GCD会自动创建(或征用)一个线程来运行每一个block,每个block一旦完成该线程就会摧毁或者返回到线程池,使用GCD,你可以专注于队列,让线程池去管理线程。
虽然可以不用手动的管理线程,但是当执行的block超过线程数量时,就会出现问题。
iOS系统提供的两个默认队列,一个是Main dispatch queue,一个是Global dispatch queue,Main queue是serial队列,只有主线程,Global队列是concurrent队列。
最常用的是用dispatch_async(one queue,block);或者dispatch_sync(one queue,block);方法向队列里添加block任务,
dispatch_after(one time,one queue,block)是在time时间后向队列里追加block,注意,这里只是追加,不是执行。
- The main queue(主线程串行队列): 与主线程功能相同,提交至Main queue的任务会在主线程中执行,
- Main queue 可以通过dispatch_get_main_queue()来获取。
- Global queue(全局并发队列): 全局并发队列由整个进程共享,有高、中(默认)、低、后台四个优先级别。
- Global queue 可以通过调用dispatch_get_global_queue函数来获取(可以设置优先级)
- Group queue (队列组):将多线程进行分组,最大的好处是可获知所有线程的完成情况。Group queue 可以通过调用dispatch_group_create()来获取,通过dispatch_group_notify,可以直接监听组里所有线程完成情况。
主线程串行队列同步执行任务,在主线程运行时,会产生死锁
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue,^{
NSLog("MainQueue");
});程序一直处于等待状态,block中的代码将执行不到
解:dispatch_sync方法将block添加到Main Queue最后,因为Main Queue是严格的FIFO队列,执行完当前的任务才会执行后面的block,但是sync函数又是执行完添加的block才往下执行其他代码,所以产生死锁。
换成async异步调用就不会死锁,异步调用完后通过状态、通知和回调通知调用方执行完成。
GCD常用的几个方法:
dispatch_async/sync:异步/同步得向queue里添加任务;
dispatch_after:
本文深入探讨了GCD(Grand Central Dispatch)的概念及其在iOS开发中的应用,包括串行和并行队列的区别、不同类型的队列如何工作,以及如何避免常见的死锁问题。
1936

被折叠的 条评论
为什么被折叠?



