1.用户自定义线程队列,创建时很容易创建 注意创建时的第一个参数:标记值,方便调试查看

1
2
dispatch_queue_t serialqueue=dispatch_queue_create("serialqueue", DISPATCH_QUEUE_SERIAL);//串行线程队列
dispatch_queue_t concurrentqueue=dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);//并行线程队列

2.创建之后那如何验证它是串行还是并行的呢?

第一种:

1
2
3
4
5
6
dispatch_apply(5, concurrentqueue, ^(size_t index) {
        NSLog(@"%ld",index);
    });
    dispatch_apply(5, serialqueue, ^(size_t index) {
        NSLog(@"%ld",index);
    });

输出结果:

第一个循环输出无序第一个有序,可以看出第一个是多线程并行,第二哥是单线程串行。

第二种:

(1)串行的验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
dispatch_async(serialqueue, ^{
        NSLog(@"1");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"2");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"3");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"4");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"5");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"6");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"7");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"8");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"9");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"10");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"11");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"12");
    });
    dispatch_async(serialqueue, ^{
        NSLog(@"13");
    });

输出结果:

可以看到输出结果连续。

(2)并行的验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
dispatch_async(concurrentqueue, ^{
        NSLog(@"1");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"2");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"3");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"4");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"5");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"6");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"7");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"8");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"9");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"10");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"11");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"12");
    });
    dispatch_async(concurrentqueue, ^{
        NSLog(@"13");
    });

输出结果:

由此可见:输出结果不连续。

3.从上面的两个输出结果可以看出:串行是在一个线程上执行任务,而并行是在多个线程上执行任务。

GCD之并行串行区别的更多相关文章

  1. GCD同步异步 串行并行大解析

    /** 核心概念 任务:block里需要执行的操作 队列:把任务添加进入队列中,按照先进先出的原则来执行任务  串行队列:一个一个的执行 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时 ...

  2. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  3. activiti并行和串行区别

    多实例还有并行.串行区分.以下解释一下什么是并行与串行 并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响. 串行代表工作或任务由一个人完成后,再由另 ...

  4. GCD编程-串行队列与并发队列

    接着上面的GCD封装,以下进行列子验证 1.导入GCD.h 2.创一个串行队列: - (void)serailQueue{ //创建出队列 GCDQueue *queue =  [[GCDQueue  ...

  5. IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

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

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

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

  7. iOS:对GCD中 同步、异步、并行、串行的见解

    1.GCD-同步执行多线程时          GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程). 2.GCD-异步执行多线程时          GCD中不管向什么类 ...

  8. ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

    现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...

  9. iOS:转载:同步、异步、并行、串行的详解

    理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21 ...

随机推荐

  1. Windows10-安装笔记

    Windows10-安装笔记... ------------------------------ ---------------------------------------- 加载镜像.加载完后. ...

  2. BotVS数字货币现货交易类库

    以下是BotVS数字货币现货交易类库模板,使用Python2语言实现 import types # 导入类型模块 import time # 导入时间模块 import platform # 版本信息 ...

  3. SQL查询--选择运算(1)

    /**  本贴使用MySQL数据库  **/ WHERE子句可以实现关系代数中的选择运算,用于查询满足选择条件的元组,常用的查询条件有: 1.比较运算:>,>=,<,<=,=, ...

  4. Oracle异常汇总

    持续更新中,可参见https://hnuhell.gitbooks.io/oracle_errmg/content/或https://hnuhell.github.io/Oracle_ERRMG/上的 ...

  5. 零基础到精通Web渗透测试的学习路线

    小编相信很多新手都会遇到以下几个问题 1.零基础想学渗透怎么入手? 2.学习web渗透需要从哪里开始? 这让很多同学都处于迷茫状态而迟迟不下手,小编就在此贴给大家说一下web渗透的学习路线,希望对大家 ...

  6. mysql排序

    MySQL里desc和asc的意思    desc是descend 降序意思     asc 是ascend 升序意思    sql = "select 表内容名    from   数据库 ...

  7. MySQL插入、更新、删除数据

    1.插入数据:由于下表的id会自增,故赋值null. 注意:字符串用'   '单引号,不能双引号,英文状态下. 可以写上部分属性名进行插入操作,如bookTypeId没写,默认NULL. 也可以写上所 ...

  8. 实战案例--TEMPDB暴涨

    前言   tempdb暴增,造成磁盘空间不足,甚至影响业务运行.     正文   如图,tempdb log文件从7.40开始突然暴涨,因为 tempdb 0 M到 40G     tempdb 所 ...

  9. java中的抛出异常throws与throw

    throws与throw throws是方法可能抛出异常的声明.(用在声明方法时,表示该方法可能要抛出异常)语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{.. ...

  10. Maven(二)Maven项目的创建(命令、myeclipse)及生命周期

    上一篇给大家介绍了Maven的概念和仓库的一些信息,接下来给大家分享一下使用命令和MyEclipse创建Maven项目 一.使用命令管理Maven项目 1.1.创建Maven java项目 1)创建一 ...