美文网首页
GCD多线程使用

GCD多线程使用

作者: dicesc | 来源:发表于2016-07-27 20:43 被阅读13次

    (一)GCD 使用步骤

    • 演示过程
      • 创建任务 - block dispatch_block_t block myBlock= ^{ }
      • 队列 dispatch_queue_t queue = dispatch_get_global_queue ( 0, 0 );
      • 任务加入到队列 dispatch_async ( queue , myBlock )
    • 开发过程使用
      • dispatch_async ( dispatch_get_global_queue ( 0, 0 ) , ^ { } ) 异步执行
    • 线程通讯 加入到主线程队列
      • dispatch_async ( dispatch_get_main_queue() , ^{ } );

    (二)队列分类

    • 并发队列 sync 搭配 同步(主线程跑,有序) 搭配 异步(开启多个线程 , 无序,效率高)
    • 串行队列 async 搭配 同步(主线程跑,有序) 搭配 异步(开一个线程, 有序)
    • 主队列 永远是同步执行 有序 dispatch_get_main_queue()
      • 搭配异步( 有序的 不开线程,主队列永远在主线程运行 )
      • 搭配同步
        • 当前代码为主线程时候, 永远不会执行,死锁
        • 当前代码为子线程时候, 子线程会等待主线程执行完该代码后 在继续执行.
    • 总结: 同步,异步 决定了是否需要开启线程
      并发,串行 决定了任务是否有序执行
    • sync注意:当加入到并发队列时候 当使用sync时候,不开线程 当前线程操作
    • 全局并发队列 dispatch_get_global_queue( 0, 0) 第一个(表示优先级) 0为兼容老系统 就是并发队列 第二个 预留参数


      screenshot.png

    (三)示例程序
    -(void)demo{

    //1.创建一个串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    
    //(1)任务1,2在子线程顺序执行-->串行队列,异步执行
    dispatch_async(serialQueue, ^{
        [self task:1];
    });
    
    dispatch_async(serialQueue, ^{
        [self task:2];
    });
    
    dispatch_sync(serialQueue, ^{
        
        //(2)完成之后通知主线程执行任务3,4并顺序执行->主队列,异步执行
        dispatch_async(dispatch_get_main_queue(), ^{
            [self task:3];
        });
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self task:4];
        });
    });
    
    //(3)完成之后开启任务5,6,7并发执行->并发队列,异步执行
    dispatch_async(dispatch_get_main_queue(), ^{
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [self task:5];
        });
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [self task:6];
        });
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [self task:7];
        });
    });
    

    }

    //任务
    -(void)task:(int)number{
    NSLog(@"task %d->%@",number,[NSThread currentThread]);
    }

    相关文章

      网友评论

          本文标题:GCD多线程使用

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