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

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

作者: Gomu_iOS | 来源:发表于2018-08-30 16:15 被阅读883次

    一、关于GCD

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

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

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

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

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

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

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

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

    三、代码示例

    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]);

    }

    总结:异步并发执行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]);

    }

    总结:异步串行执行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]);

    }

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

    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]);

    }

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

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

    相关文章

      网友评论

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

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