1. 在iOS中队列分为以下几种:
- 串行队列:(
队列中的任务只会顺序执行,任务按往队列里的添加先后顺序执行,先进先出(FIFO),前一个任务执行完再开始执行下一个任务。(我们开发中主线程队列就是一个串行队列,所以我们经常在主线程写的一般任务(不考虑多线程),都是顺序执行的)。
注意一个串行队列里只有一个线程。
)
dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
- 并行队列: (
任务会在这个队列中新开线程,并发同时执行(无序)。
)
dispatch_queue_t q = dispatch_queue_create("......",DISPATCH_QUEUE_CONCURRENT);
- 全局队列:(
是系统的,直接拿过来(GET)用就可以;与并行队列类似
)
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- 主队列:(
每一个应用程序对应唯一主队列,直接GET即可;在多线程开发中,使用主队列更新UI
)
dispatch_queue_t q = dispatch_get_main_queue();
2. 线程执行方式
- 同步执行 (
任务都在当前线程中执行,执行过程中会阻塞当前线程
)
dispatch_async(queue, ^{ // 执行代码 })
- 异步执行(
任务会开辟新的线程,并在新的线程中执行,不会阻塞当前线程
)
dispatch_sync(queue, ^{ // 执行代码 })
根据不同的队列种类及执行方式组和为一下四种形式
- 1)串行队列同步执行
- 2)串行队列异步执行
- 3)并发队列同步执行
- 4)并发队列异步执行
并行队列 | 串行队列 | |
---|---|---|
同步执行(无开启新线程能力 ) |
任务都在当前线程执行(同步),但是是顺序执行的(并没有体现并发的特性)(不开启新线程 ) |
任务都在当前线程执行(同步),并且顺序执行(串行)(不开启新线程 ) |
异步执行(有开启新线程的能力 ) |
任务在开辟的多个子线程中执行(异步),并且是同时执行的(并发)(开启多调子线程 ) |
任务都在开辟的新的子线程中执行(异步),并且顺序执行(串行)(开启一条子线程 ) |
更多细节见下图: