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

一、关于GCD

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

ios-GCD基础篇同步、异步,并发、并行的理解_第1张图片

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

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

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

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

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

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

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

三、代码示例

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基础篇同步、异步,并发、并行的理解)