gcd初探

作者: AntKing | 来源:发表于2017-04-28 15:27 被阅读0次

gcd是多线程开发的神器,其效率之高,功能之强大,非只言片语所能说清楚的具体以下面的代码为基础进行探究,gcd在ios开发中可以直接使用,不用引入什么头文件

  • 1异步函数+并发队列:会开启多条线程,队列中的任务是并发执行
  • 2异步函数+串行队列:会开线程,开一条线程,队列中的任务是串行执行的
  • 3同步函数+并发队列:不会开线程,任务是串行执行的
  • 4异步函数+主队列:所有任务都在主线程中执行,不会开线程

综上,可以看出来只有并发队列+ 异步函数,才会开辟子线程,否则都是在主线程执行


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

#pragma mark ----------------------
#pragma Events
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    [NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil];
    
    [self asyncConcurrent];
}

#pragma mark ----------------------
#pragma Methods
//异步函数+并发队列:会开启多条线程,队列中的任务是并发执行
-(void)asyncConcurrent
{
    //1.创建队列
    /*
     第一个参数:C语言的字符串,标签
     第二个参数:队列的类型
        DISPATCH_QUEUE_CONCURRENT:并发
        DISPATCH_QUEUE_SERIAL:串行
     */
    //dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);
    
    //获得全局并发队列
    /*
     第一个参数:优先级
     第二个参数:
     */
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    NSLog(@"---satrt----");
    
    //2.1>封装任务2>添加任务到队列中
    /*
     第一个参数:队列
     第二个参数:要执行的任务
     */
    dispatch_async(queue, ^{
        NSLog(@"download1----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"download2----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"download3----%@",[NSThread currentThread]);
    });
    
     NSLog(@"---end----");
}

//异步函数+串行队列:会开线程,开一条线程,队列中的任务是串行执行的
-(void)asyncSerial
{
    //1.创建队列
    dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_SERIAL);

    //2.封装操作
    dispatch_async(queue, ^{
        NSLog(@"download1----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"download2----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"download3----%@",[NSThread currentThread]);
    });
}

//同步函数+并发队列:不会开线程,任务是串行执行的
-(void)syncConcurrent
{
    //1.创建队列
    dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);
    
    NSLog(@"---start---");
    //2.封装任务
    dispatch_sync(queue, ^{
        NSLog(@"download1----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"download2----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"download3----%@",[NSThread currentThread]);
    });
    
     NSLog(@"---end---");
}

//同步函数+串行队列:不会开线程,任务是串行执行的
-(void)syncSerial
{
    //1.创建队列
    dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);
    
    //2.封装任务
    dispatch_sync(queue, ^{
        NSLog(@"download1----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"download2----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"download3----%@",[NSThread currentThread]);
    });
}

//异步函数+主队列:所有任务都在主线程中执行,不会开线程
-(void)asyncMain
{
    //1.获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();

    //2.异步函数
    dispatch_async(queue, ^{
        NSLog(@"download1----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"download2----%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"download3----%@",[NSThread currentThread]);
    });
}

//同步函数+主队列:死锁
//注意:如果该方法在子线程中执行,那么所有的任务在主线程中执行,
-(void)syncMain
{
    //1.获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    NSLog(@"start----");
    //2.同步函数
    //同步函数:立刻马上执行,如果我没有执行完毕,那么后面的也别想执行
    //异步函数:如果我没有执行完毕,那么后面的也可以执行
    dispatch_sync(queue, ^{
        NSLog(@"download1----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"download2----%@",[NSThread currentThread]);
    });
    
    dispatch_sync(queue, ^{
        NSLog(@"download3----%@",[NSThread currentThread]);
    });
    
    NSLog(@"end---");
}
@end


相关文章

  • GCD 底层源码分析(一)

    GCD 初探函数和队列 GCD 简介 什么是GCD? 全称是 Grand Central Dispatch,纯 C...

  • gcd初探

    gcd是多线程开发的神器,其效率之高,功能之强大,非只言片语所能说清楚的具体以下面的代码为基础进行探究,gcd在i...

  • GCD初探

    1. GCD介绍 什么是GCD?GCD全称是Grand Central Dispatch,纯C语言,提供了非常多强...

  • iOS GCD初探

    一、GCD简介 1.什么是GCD 全称是Grand Central Dispatch 纯C语言,提供了非常多强大的...

  • iOS线程之GCD初探

    简述:说道线程,离不开并行和串行,所谓并行,就是100赛跑,每个赛道就是一个线程,每个线程之间互不影响,同时都可以...

  • GCD之函数与队列初探

    一、前言 在iOS开发过程中,我们知道多线程技术是使用最多的情况,能快速的执行多个调度任务的执行。而在多线程开发过...

  • 苹果 ARKit 初探

    苹果 ARKit 初探 苹果 ARKit 初探

  • iOS 8 Size Classes初探

    iOS 8 Size Classes初探 iOS 8 Size Classes初探

  • WWDC 2018:初探 Create ML

    WWDC 2018:初探 Create ML WWDC 2018:初探 Create ML

  • iOS 初探代码混淆(OC)

    iOS 初探代码混淆(OC) iOS 初探代码混淆(OC)

网友评论

      本文标题:gcd初探

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