/**
 核心概念
 任务:block里需要执行的操作
 队列:把任务添加进入队列中,按照先进先出的原则来执行任务
 
 串行队列:一个一个的执行
 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。
 
 同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行
 异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻  执行任务
 
 同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务
 同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务
 异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行
 异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
 
 主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI)
 异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务
 同步任务主队列:死锁
 
 全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级
 
 开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程)
 开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程,具体多少个由任务的数量和GCD的底层来决定的

*/

//串行队列:一个一个执行
//同步操作:不开启新的线程
//执行结果:不开启新的线程,一个一个顺序执行

- (void)gcdTest1 {
   
    //label:队列名
    //attr:队列属性(串行,并发)
    //DISPATCH_QUEUE_SERIAL 串行
    //DISPATCH_QUEUE_CONCURRENT 并发
   
    //#define DISPATCH_QUEUE_SERIAL NULL
   
    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);
   
    NSLog(@"开始");
    //同步操作
    //操作任务:block
    dispatch_sync(queue, ^{
        //打印当前线程
        NSLog(@"%@",[NSThread currentThread]);
    });
   
    NSLog(@"结束");
      
}

//串行队列:一个一个执行
//异步操作:会开启新的线程
//执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行

- (void)gcdTest2 {
   
    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);
   
   
    NSLog(@"开始");
   
    for (NSInteger i = 0 ; i < 10; i ++ ) {
       
        //异步请求
        dispatch_async(queue, ^{
           
            NSLog(@"%@,%@",[NSThread currentThread],@(i));
           
        });
    }
   
    NSLog(@"结束");
   
   
}

//并发队列:多个线程同时执行
//异步操作:会开启新的线程
//执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

- (void)gcdTest3 {
   
    //开启并发队列
    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
   
    NSLog(@"开始");
   
    for (NSInteger i = 0 ; i < 10; i ++ ) {
       
        //执行异步操作
        dispatch_async(queue, ^{
           
            NSLog(@"%@",[NSThread currentThread]);
        });
    }
   
    NSLog(@"结束");
}

//并发队列:多个线程同时执行
//同步操作:不会开启新的线程
//执行结果:不会开启新的线程,立即执行

- (void)gcdTest4 {
   
    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
   
    NSLog(@"开始");
   
    for (NSInteger i = 0 ; i < 10; i ++ ) {
       
        dispatch_sync(queue, ^{
            NSLog(@"%@,%@",[NSThread currentThread],@(i));
        });
    }
   
    NSLog(@"结束");
}

主队列的异步操作
- (void)gcdTest5 {
   
    // 主队列就是一种特殊的串行队列
    // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行
   
    dispatch_queue_t queue = dispatch_get_main_queue();
   
    NSLog(@"开始");
   
    for (NSInteger i = 0; i < 10; i ++) {
        //主队列执行异步操作,异步操作有一个等待的过程
        dispatch_async(queue, ^{
            NSLog(@"%@",[NSThread currentThread]);
        });
    }
   
    NSLog(@"结束");
}

主队列的同步操作

- (void)gcdTest6 {
   
    dispatch_queue_t queue = dispatch_get_main_queue();
   
    NSLog(@"1");
   
    //在主队列里执行同步操作,产生死锁
   
    //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。
   
    dispatch_sync(queue, ^{
        NSLog(@"2");
    });
   
    NSLog(@"3");

}

- (void)gcdTest7
{
    //全局队列
    //identifier  队列优先级
    //flags  苹果预留的参数(没有用)
    //DISPATCH_QUEUE_PRIORITY_DEFAULT  一般使用默认优先级
   
    //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
   
    //默认是并发队列,dispatch_get_global_queue用的多
   
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
   
    for (NSInteger i = 0; i < 10; i++) {
       
        //并发加异步
        dispatch_async(queue, ^{
           
            NSLog(@"%@",[NSThread currentThread]);
           
        });
       
    }

}

GCD进程间通信

//button的响应方法
- (IBAction)downLoadImage:(id)sender {
   
    NSLog(@"%@",[NSThread currentThread]);
   
    //获取全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
   
    //执行异步操作
    dispatch_async(queue, ^{
   
        NSLog(@"%@",[NSThread currentThread]);
       
        NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";
       
        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
       
        UIImage * image = [UIImage imageWithData:data];
       
        //返回主线程更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
           
            NSLog(@"%@",[NSThread currentThread]);

self.imageView.image = image;

});
    });
   
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
   
    //同步操作用途
   
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
   
    dispatch_sync(queue, ^{
        NSLog(@"登录");
    });
   
    dispatch_async(queue, ^{
        NSLog(@"下载小说A");
    });
   
    dispatch_async(queue, ^{
        NSLog(@"下载小说B");
    });
   
}

GCD同步异步 串行并行大解析的更多相关文章

  1. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  2. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

  3. iOS多线程——同步异步串行并行

    串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行 ...

  4. IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  5. [深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?

    为什么CNN是同步(并行)而RNN是异步(串行)的呢? 个人主页--> https://xiaosongshine.github.io/ 1.问题引出 CNN与RNN都是采用parameter ...

  6. 串行&并行&并发,同步&异步

    1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...

  7. STM32学习笔记(五) USART异步串行口输入输出(轮询模式)

    学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...

  8. iOS:GCD理解1(同步-异步、串行-并行)

    1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...

  9. iOS:GCD理解1(串行-并行、同步-异步)

    1.获取并行.创建串行 队列 1-1).获取 并行(全局) 队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t global_qu ...

随机推荐

  1. SQL约束

    SQL约束: 非空约束:就是不能为null: 主键约束(PK):唯一,不重复,并且不为空: 唯一约束:唯一,允许为空,但只能出现一次: 默认约束:如果不给值,默认值: 检查约束:范围以及格式限制: 外 ...

  2. css3很美的蟠桃动画

    查看效果:http://hovertree.com/texiao/css3/26/ 源码下载:http://hovertree.com/h/bjaf/ndhxgfkn.htm 效果图如下: 代码如下: ...

  3. 为什么很多APP要有启动页面

    我们启动APP时,一般都会是一张含有LOGO的图片.这张图片叫做启动页面. 这个启动页面是必须.一定需要的吗?有什么作用?   这是苹果官方对于iOS启动页的设计说明:   为了增强应用程序启动时的用 ...

  4. DokuWiki用storage的模式在sae上部署后速度太慢

    利用sae做的io wrapper接口,对dokuwiki做了基于sae的分布式storage存储改造,能正常安装和运行,但速度太慢,基本没什么用. 定义一个常量: define('SAESTORE_ ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. DBHelper (支持事务与数据库变更)

    1 概述 更新内容:添加 "支持数据分页" 这个数据库操作类的主要特色有 1>     事务操作更加的方便 2>     变更数据库更加的容易 3>  支持数据分 ...

  7. freeradius 安装出错的解决办法

    sudo apt-get install freeradius-mysql Selecting previously unselected package freeradius-mysql. (Rea ...

  8. Java Swing快速构建窗体应用程序

    以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...

  9. 赞!带进度条的 jQuery 文件拖放上传插件

    jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...

  10. 【精心挑选】15款最好的 jQuery 网格布局插件(Grid Plugins)

    如今,大多数网站设计要靠网格系统和布局,这能够提供给设计人员一个方便的途径来组织网页上的内容.网格的设计最常见于报纸和杂志的版面,由文字和图像构成的列组成. 这篇文章给大家分享精心挑选的15款最佳的 ...