博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程篇-GCD-基本概念使用
阅读量:5226 次
发布时间:2019-06-14

本文共 2884 字,大约阅读时间需要 9 分钟。

简述

  • 同步函数和异步函数
    • 同步函数
      objc //传入的为队列和任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
    • 异步函数
      objc //传入的为队列和任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
  • 两个核心概念队列任务
    • 队列

      * 串行队列

      //两者可随意选择dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_SERIAL);dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);
      * 并发队列
      dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);
    • 任务

      * block 来定义的,预先准备好的代码,在需要的时候执行

      void (^task)() = ^ {    NSLog(@"%@", [NSThread currentThread]);};

重点

  • 同步函数+串行队列
    • 代码
    /**不会开线程,串行执行*/-(void)gcdDemo1 {// 1. 队列    /**     参数     1. 队列的名称     2. 队列的属性        DISPATCH_QUEUE_SERIAL(NULL) 表示串行     */    //dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_SERIAL);    dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);    // 2. 执行任务    for (int i = 0; i<10; i++) {        dispatch_sync(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}
    • 结果

      731729-20160113222621319-991788287.png

  • 同步函数+并发队列
    • 代码
    //并发队列,同步执行/**队列:并发队列,可以调度多个任务同步:不能开线程*/-(void)gcdDemo2 {    // 1. 队列    dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);    // 2. 异步执行    for (int i = 0; i<10; i++) {        dispatch_sync(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}
    • 结果

      731729-20160113222621319-991788287.png

  • 同步函数+主队列
    • 代码
    //  主队列,同步执行/**主队列:不开线程同步任务:不开线程*/-(void)gcdDemo6 {    // 1. 主队列    dispatch_queue_t q = dispatch_get_main_queue();    // 2. 安排一个任务    for (int i = 0; i<10; i++) {        dispatch_sync(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}
    • 结果
    可以看到输出出来的结果是没有的//主队列的特点,如果发现当前主线程有任务在执行,那么主队列会暂停调度队列里面的任务,所以的话它是不会执行队列里面的内容
  • 异步函数+串行队列
    • 代码
    //  串行队列,异步执行    /**     串行队列,一个一个调度任务     执行的方法:异步,会开线程     */-(void)gcdDemo3 {    dispatch_queue_t q = dispatch_queue_create("LitterL", NULL);    for (int i = 0; i<10; i++) {        //异步函数        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}
    • 结果

      731729-20160114223651553-357657581.png

  • 异步函数+并发队列
    • 代码
    //并发队列,异步执行    /**     队列:并发队列,可以调度多个任务     异步:可以开启线程     */-(void)gcdDemo4 {    // 1. 队列    dispatch_queue_t q = dispatch_queue_create("LitterL", DISPATCH_QUEUE_CONCURRENT);    // 2. 异步执行    for (int i = 0; i<10; i++) {        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}
    • 结果
      731729-20160114223831882-57120345.png
  • 异步函数+主队列
    • 代码
    //  主队列,异步执行/**队列:主队列,不可能在其他线程执行任务:异步,开线程,不会阻塞线程执行,不用等待着一条语句执行完,就能执行下一句*/-(void)gcdDemo5 {    // 1. 主队列 - 程序启动之后已经存在主线程,主队列同样存在    dispatch_queue_t q = dispatch_get_main_queue();    // 2. 安排一个任务    for (int i = 0; i<10; i++) {        dispatch_async(q, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}
    • 结果
    731729-20160114223915928-1167434999.png

补充

异步函数+并发队列:开启多条线程,并发执行任务

异步函数+串行队列:开启一条线程,串行执行任务
同步函数+并发队列:不开线程,串行执行任务
同步函数+串行队列:不开线程,串行执行任务
异步函数+主队列:不开线程,在主线程中串行执行任务
同步函数+主队列:不开线程,串行执行任务(注意死锁发生)

结束

本章到此结束            欢迎各位码友随意转载并指正

转载于:https://www.cnblogs.com/ljy-666/p/5125825.html

你可能感兴趣的文章
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
OpenCv-Python 图像处理基本操作
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
正则表达式2
查看>>
Unity3D_(插件)小地图自刷新制作Minimap小地图
查看>>
为什么分布式一定要有Redis?
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
团队的绩效评估计划
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>