美文网首页
多线程GCD

多线程GCD

作者: 西门丨不吹雪 | 来源:发表于2016-07-21 22:56 被阅读13次
    Paste_Image.png

    iOS 并发概念浅析

    Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法,宏大的中央调度,串行队列、并发队列、主线程队列,必须回到主线程刷新UI

    • 优点:最高效,避开并发陷阱。
    • 缺点:基于C实现。

    1.串行队列

    获取mainQueue,mainQueue会在主线程中执行,即:主线程中执行队列中的各个任务

    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue, ^{
        NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
     });
    

    自己创建serial queue。自己创建的serial queue 不会在主线程中执行,queue会开辟一个子线程,在子线程中执行队列中的各个任务。

    dispatch_queue_t mySerialQueue = dispatch_queue_create("com.boweifeng.GCD.mySerialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(mySerialQueue, ^{
        NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
     });
    

    2.并发队列
    获得concurrent queue的方式有两种

    1、获得global queue

    global queue会根据需要开辟若干个线程,并行执行队列中的任务。开始较早的任务并不一定最早结束,开辟的线程数量取决于多方面的因素。比如:任务的数量,系统的内容资源。但是TA会以最优的方式开辟线程----根据需求自动开辟

    dispatch_queue_t globalQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);
    dispatch_async(globalQueue, ^{
        NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
    });
    

    2.自己创建一个concurrent queue

    dispatch_queue_t myConcurrentQueue = dispatch_queue_create("com.bwf.GCD.myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);    
    dispatch_async(myConcurrentQueue, ^{
        NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
    });
    

    3.dispatch_after

    函数作用是延时执行某个任务,任务既可以在mainQueue中执行,也可以在其他queue中执行。既可以在serial队列中执行,也可以在concurrent队列中执行

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"我觉得五秒就挺好!");
    });
    

    4.组线程

    创建一个组线程 在组线程里可以执行多个线程

    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t myConcurrntQueue = dispatch_queue_create("com.lanou.GCD.cct", DISPATCH_QUEUE_CONCURRENT);
    //把创建出来的线程放到主线程中执行
    dispatch_group_async(group, myConcurrntQueue, ^{
        NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
    });
    //在组线程里执行完所有了任务后 再执行此任务
    dispatch_group_notify(group, myConcurrntQueue, ^{
        NSLog(@"group中的任务都执行完毕之后,执行此任务,所在线程为%@,是否为主线程%d",[NSThread currentThread],[NSThread isMainThread]);
    });
    

    5.once

    用于定义那些只需要执行一次的代码,比如单例的创建

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"只执行一次!");
        //这个Block里的代码,在程序执行过程中,只会执行一次。
        //比如在这里写单例的初始化
        static YourClass *instance = nil;
        instance = [[YourClass alloc] init];
    });

    相关文章

      网友评论

          本文标题:多线程GCD

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