//串行队列:(线程同步)添加到这个队列的任务一个接一个的执行(一个任务完成,才再去完成另一个任务)
dispatch_queue_t queue1 = dispatch_get_main_queue();//获取系统串行队列//1.向系统的串行队列添加异步任务,还是在主线程完成 2.向系统的串行队列中添加同步任务,会造成其他人无法执行。
dispatch_queue_t queueSerial = dispatch_queue_create("com.123.23", DISPATCH_QUEUE_SERIAL);//1.队列的唯一标识,采用反域名的形式 2.队列的属性类型,即这个队列是串行对列还是并行队列 2.1 自己创建的串行队列中添加异步任务是在子线程中完成任务 2.2 自己创建的串行队列中添加同步任务是在主线程中完成。SERIAL-串行
dispatch_queue_t queueCon = dispatch_queue_create("com.123.23", DISPATCH_QUEUE_CONCURRENT);//并行队列
//异步任务---第一个参数:任务添加到队列名称 第二个参数:block执行任务内容
dispatch_async(queueSerial, ^{
// NSLog(@"串行异步0-%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
});
//异步任务---第一个参数:任务添加到队列名称 第二个参数:block执行任务内容
dispatch_async(queueCon, ^{
// NSLog(@"并行异步0-%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
});
dispatch_async(queue1, ^{
// NSLog(@"异步0-%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
});
dispatch_sync(queueSerial, ^{
// NSLog(@"串行同步0-%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
});
dispatch_sync(queueCon, ^{
// NSLog(@"并行同步0-%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
});
//总结:1.同步任务无论是在串行队列还是并行队列,都是在主线程中完成,但是不能将同步任务添加到系统队列中 2.异步任务无论是添加到自己创建的同步队列还是异步队列都是在子线程中执行;当添加到系统队列中时,是在主线程完成。
dispatch_queue_t queueGlo = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//获得程序进程缺醒产生的并发队列,可设定优先级来选择高、中、低三个优先级队列,由于是系统默认生成的,所以是不能调用dispatch_resume、dispatch_suspend来控制执行继续或中断。需要注意的是,三个队列不代表三个线程,可能是很多线程。并发队列根据实际情况来自动产生合理的线程数,也可理解为dispatch队列实现了一个线程池的管理,对于程序逻辑是透明的
//----------------并行队列(线程并发)添加到队列的任务同时执行-------- 假象----
//queueGlo---为系统自带的并行队列
//DISPATCH_QUEUE_PRIORITY_DEFAULT---队列的优先级
//0-----预留参数
dispatch_queue_t queucC = dispatch_queue_create("com.zxc.zb", DISPATCH_QUEUE_CONCURRENT);// 自己创建并行队列--通常情况下是不用自己创建并行队列的,系统的并行队列已经够用了
dispatch_sync(queueGlo, ^{
NSLog(@"queueGlo--同步%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
});
dispatch_async(queucC, ^{
NSLog(@"queucC--异步%@ %d",[NSThread currentThread],[NSThread currentThread].isMainThread);
//线程间的通信---由子线程回到主线程 ----获取系统的串行队列
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"我回到主线程了");
});
});
案例1
NSLog(@"1");//任务1
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");//任务2
});
NSLog(@"3");//任务3
分析:
首先执行任务1,这是肯定没问题的,只是接下来,程序遇到了同步线程,那么它会进入等待,等待任务2执行完,然后执行任务3。但这是队列,有任务来,当然会将任务加到队尾,然后遵循FIFO原则执行任务。那么,现在任务2就会被加到最后,任务3排在了任务2前面,问题来了:
任务3要等任务2执行完才能执行,任务2又排在任务3后面,意味着任务2要在任务3执行完才能执行,所以他们进入了互相等待的局面。【既然这样,那干脆就卡在这里吧】这就是死锁。
案例二
NSLog(@"1");//任务1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"2");//任务2
});
NSLog(@"3");//任务3
结果:
1
2
3
分析:
首先执行任务1,接下来会遇到一个同步线程,程序会进入等待。等待任务2执行完成以后,才能继续执行任务3。从dispatch_get_global_queue可以看出,任务2被加入到了全局的并行队列中,当并行队列执行完任务2以后,返回到主队列,继续执行任务3。