08、GCD的任务和队列

1、GCD的执行任务方式
1)同步的方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

queue:队列
block:任务

2)异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);


2、GCD的队列类型
1)并发对列(Concurrent Dispatch Queue)
·可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
·并发功能只有在异步(dispatch_async)函数下才有效

2)串行队列(Serial Dispatch Queue)
·让任务一个接着一个执行(一个任务执行完毕后,再执行下一个任务)


3、总结
1)同步和异步决定了要不要开启新的线程
·同步:在当前线程中执行任务,不具备开启新的线程的能力
·异步:在新的线程中执行任务,具备开启新线程的能力

2)并发和串行决定了任务的执行方式
·并发:多个任务并发(同时)执行
·串行:一个任务执行完毕后,再执行下一任务


4、串行队列
//1 串行队列,同步执行 不开新线程, 任务是按顺序执行
- (void)demo1 {
//串行队列
dispatch_queue_t queue = dispatch_queue_create("hm", DISPATCH_QUEUE_SERIAL);
for (int i=0; i<10; i++) {
dispatch_sync(queue, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
}

//2 串行队列,异步执行 开启新线程(1个),任务是有序执行
- (void)demo2 {
//串行队列
dispatch_queue_t queue = dispatch_queue_create("hm", DISPATCH_QUEUE_SERIAL);
for (int i=0; i<10; i++) {
dispatch_async(queue, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
}


5、并行队列
//1 并行队列,同步执行 ----- 串行队列,同步执行 不开线程,顺序执行
- (void)demo1 {
//并行队列
dispatch_queue_t queue = dispatch_queue_create("hm", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
dispatch_sync(queue, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
}
//2 并行队列,异步执行 开多个线程,无序执行,每次开的线程数是不固定的,
//不由我们控制,是GCD控制的
- (void)demo2 {
//并行队列
dispatch_queue_t queue = dispatch_queue_create("hm", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
dispatch_async(queue, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
}


6、主队列
1)主队列,异步任务
·不开线程,同步执行
·主队列特点:如果主线程正在执行代码暂时不调度任务,等主线程执行结束后,才调度任务
·主队列又叫全局串行队列

2)主队列,同步任务
·程序执行不出,发生死锁现象
·死锁的原因:主队列,如果主线程正在执行代码就不调度任务;
同步执行,如果第一个任务没有执行,就等待第一个任务执行完成,
再执行下一任务,此时互相等待,程序无法向下执行,发生死锁

//1 主队列,异步执行 主线程,顺序执行
//主队列的特点:先执行完主线程上的代码,才会执行主队列中的任务
- (void)demo1 {
for (int i = 0; i < 10; i++) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
}

//2 主队列,同步执行 --- 主线程上执行才会死锁
//同步执行:会等着第一个任务执行完成,才会继续往后执行

- (void)demo2 {
NSLog(@"begin");
for (int i = 0; i < 10; i++) {
//死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
NSLog(@"end");

}

//3 解决死锁的问题
- (void)demo3 {
NSLog(@"begin");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 10; i++) {
//死锁
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
});
NSLog(@"end");
}


//dispatch_queue_t queue = dispatch_queue_create("mm", DISPATCH_QUEUE_CONCURRENT);

//dispatch_get_global_queue(0, 0);

- (void)demo4 {
// dispatch_get_global_queue(0, 0);
//iOS7以后推荐使用服务质量
// * - QOS_CLASS_USER_INTERACTIVE
// * - QOS_CLASS_USER_INITIATED
// * - QOS_CLASS_DEFAULT
// * - QOS_CLASS_UTILITY
// * - QOS_CLASS_BACKGROUND

//iOS7以前,队列的优先级, 队列的优先级和服务质量是对应关系
// * - DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED
// * - DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT
// * - DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY
// * - DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND
}


7、全局队列
1)全局队列本质就是并行队列

2)全局队列参数
dispatch_get_global_queue(0, 0);
第一个参数线程优先级,0代表默认优先级,
第二个参数保留位,没实际意义,写0就好

//同步任务,依次打印日志:输入密码--扣费--下载应用
//appStore下载应用--输入密码--扣费--下载应用
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"输入密码 %@",[NSThread currentThread]);
});
dispatch_sync(dispatch_get_global_queue(0, 0), ^{
NSLog(@"扣费 %@",[NSThread currentThread]);
// [NSThread sleepForTimeInterval:1];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"下载应用 %@",[NSThread currentThread]);
});
});











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值