GCD多线程使用

(一)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为兼容老系统 就是并发队列 第二个 预留参数


    GCD多线程使用_第1张图片
    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多线程使用)