美文网首页
ios-GCD基础篇同步、异步,并发、并行的理解

ios-GCD基础篇同步、异步,并发、并行的理解

作者: luonaerduo | 来源:发表于2019-08-05 14:45 被阅读0次

一、关于GCD

GCD全称是Grand Central Dispatch,是苹果公司为多核的并行运算提出的解决方案, GCD会自动利用更多的CPU内核(比如双核、四核),GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

image

二、关于同步、异步、并发、串行

同步和异步决定了要不要开启新的线程

同步:在当前线程中执行任务,不具备开启新线程的能力

异步:在新的线程中执行任务,具备开启新线程的能力

并发和串行决定了任务的执行方式

并发:多个任务并发(同时)执行

串行:一个任务执行完毕后,再执行下一个任务

三、代码示例

1、用异步函数往并发队列中添加任务

//异步并发

-(void)ybbf{

//获取全局并发队列

dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//2.添加任务到队列中,就可以执行任务

dispatch_async(queue, ^{

   NSLog(@"下载图片1----%@",[NSThread currentThread]);

   });

dispatch_async(queue, ^{

   NSLog(@"下载图片2----%@",[NSThread currentThread]);

       });

dispatch_async(queue, ^{

   NSLog(@"下载图片3----%@",[NSThread currentThread]);

    });

//打印主线程

NSLog(@"主线程----%@",[NSThread mainThread]);

}

image

总结:异步并发执行3个任务,会开启3个子线程。

2、用异步函数往串行队列中添加任务

//异步串行

-(void)ybcx{

//创建一个队列,queneName不要加@,这里用c写法

dispatch_queue_t queue =  dispatch_queue_create("queneName", NULL);

//2.添加任务到队列中,就可以执行任务

dispatch_async(queue, ^{

    NSLog(@"下载图片1----%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

    NSLog(@"下载图片2----%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

    NSLog(@"下载图片3----%@",[NSThread currentThread]);

});

//打印主线程

NSLog(@"主线程----%@",[NSThread mainThread]);

}

image

总结:异步串行执行3个任务,只会开启一个子线程。

3、用同步函数往并发队列中添加任务

//同步并发

-(void)tbbf{

//获取全局并发队列

dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//2.添加任务到队列中,就可以执行任务

dispatch_sync(queue, ^{

    NSLog(@"下载图片1----%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

    NSLog(@"下载图片2----%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

    NSLog(@"下载图片3----%@",[NSThread currentThread]);

});

//打印主线程

NSLog(@"主线程----%@",[NSThread mainThread]);

}

image

总结:不会开启新的线程,并发队列失去了并发的功能。

4、用同步函数往串行队列中添加任务

//同步串行

-(void)tbcx{

//创建一个队列,queneName不要加@,这里用c写法

dispatch_queue_t queue =  dispatch_queue_create("queneName", NULL);

//2.添加任务到队列中,就可以执行任务

dispatch_sync(queue, ^{

    NSLog(@"下载图片1----%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

    NSLog(@"下载图片2----%@",[NSThread currentThread]);

});

dispatch_sync(queue, ^{

    NSLog(@"下载图片3----%@",[NSThread currentThread]);

});

//打印主线程

NSLog(@"主线程----%@",[NSThread mainThread]);

}

image

总结:不会开启新的线程,创建的自定义队列无效。

注:主队列中不允许同步,不然会造成死锁,卡死线程。

作者:哼宾克斯的酒的梅丽
链接:https://www.jianshu.com/p/1ddfd803ccec
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关文章

网友评论

      本文标题:ios-GCD基础篇同步、异步,并发、并行的理解

      本文链接:https://www.haomeiwen.com/subject/tbrmdctx.html