1、任务:需要执行的操作
2、队列:用来存放任务
将任务放到队列中,DCD会自动将任务从队列中取出,放到对应的线程中执行。
1、同步函数:用同步的方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
2、异步函数:用异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block)
同步和异步的区别:
同步:在当前线程中执行
异步:在另一条线程中执行
1、串行队列:让任务一个接一个执行(当前任务执行完毕,才能执行下一个任务)
2、并行队列:多个任务并发(同时)执行,(自动开启多个线程同时执行任务),并发队列只有在异步函数中有效,因为并发队列要想执行多个任务首先得开启多个线程,而同步函数不会开启新的线程。
1、同步和异步决定是否开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力;
异步:在新的线程中执行任务,具备开启新线程的能力;
2、并发和串行决定了执行任务的方式
并发:多个任务同时(并发)执行。并发队列起效的前提是使用异步函数。
串行:一个任务执行完毕,再执行下一个任务
1、串行队列:
(1). 使用dispatch_queue_create函数创建串行队列
dispatch_queue_t queue =dispatch_queue_create("Lotheve", NULL);
//参数分别为队列名称、队列属性(一般用NULL即可)
(2).获取主队列(主队列是一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行)
dispatch_queue_t queue = dispatch_get_main_queue();
2、并发队列:
使用dispatch_get_global_queue函数获得全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一个参数分别为全局队列优先级,进程中存在3个全局队列:低、中(默认)、高三个优先级队列,这里选择默认的。第二个参数暂时无用,用0即可。
首先大家要明确的一点是,并不是说一个队列对应一个线程,这种说法是不对的(当然主队列很特殊,它当中的任务全都在主线程中执行)。GCD使用的机制是,通过函数将任务放置在指定队列中,GCD将任务从队列中取出,分配到指定线程中执行。
各种队列的执行效果:
1、用异步函数往并发队列添加任务:开启若干线程,实现了并发的效果。
2、用异步函数往串行队列添加任务:开启了一个线程。
3、用同步函数往并发队列添加任务:未开启线程,并发队列失去并发的功能。
4、用同步函数往串行队列添加任务:未开启线程。
另外:如果把任务放到主队列中执行,那么不论处理函数是同步函数还是异步函数,都不会开启新的线程。事实上,在主线程中使用同步函数执行主队列中的任务会产生死锁阻塞线程,而在非主线程中使用同步函数执行主队列中的任务是办不到的,因此 只能用异步函数执行主队列中的任务,任务最终都将在主线程中执行。