dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);

    dispatch_async(serialQueue, ^{
// NSLog(@"");
sleep();
NSLog(@"");
});
dispatch_sync(serialQueue, ^{ sleep();
NSLog(@""); });
dispatch_async(serialQueue, ^{
NSLog(@"");
});
dispatch_sync(serialQueue, ^{
sleep();
NSLog(@"");
}); dispatch_async(serialQueue, ^{ NSLog(@"");
});

看看上面的代码,你猜猜会输出什么东东?  反正在今天之前我会认为它输出坑定不是有序的,之前一直认为串行就是一个一个执行,好,第一个是异步,那就异步去吧,第二个同步,同步执行完,去执行第三个,然后.....  同步就执行完,然后执行下一个,异步就不知道什么时候执行完了。

哈哈哈哈,今天我不得不对自己的想法勘称sb。太自以为是了。从中就可以看出我不能理解串行队列的本质。

那么什么是串行队列?什么是并行队列?

  • Concurrent: tasks are dequeued in FIFO order, but run concurrently and can finish in any order.

  • Serial: tasks execute one at a time in FIFO order

并发: 任务以FIFO从序列中移除,然后并发运行,可以按照任何顺序完成。它会自动开启多个线程同时执行任务

串行:  任务以FIFO从序列中一个一个执行。一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)而且只会开启一条线程

为了再次证实串行队列中只有一个线程执行任务:

dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);

    for (int i = 0; i< 10;i++){
// 10个异步
dispatch_async(queue, ^{
NSLog(@"%@--%d",[NSThread currentThread], i);
});
}

我们可以发现thread的地址是一样的,那就证实了serial queue只有一个线程执行任务。然后我们测试一下并发队列

dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);

    for (int i = 0; i< 10;i++){
// 10个异步
dispatch_async(queue, ^{
NSLog(@"%@--%d",[NSThread currentThread], i);
});
}

由上图可以看出并发队列中是有多个线程执行任务的。

比较上面两个程序,我们仅仅是创建了两个不同类型的queue,但是结果迥然不同,并发会开启多个线程,执行的顺序我们无法控制,至于那个线程执行那个任务由队列决定,哪个任务先完成由CPU和操作系统决定,并且并发队列中的线程是可以重复利用(线程池),这也是可以理解的,但是下面:

dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);

    for (int i = ; i< ;i++){
// 10个异步
dispatch_sync(queue, ^{
NSLog(@"%@--%d",[NSThread currentThread], i);
});
}

发现并发只能在异步函数下有效,name=main ,还不会创建新线程。所有的任务依次在主线程上执行。

最新文章

  1. Hololens开发笔记之Gesture手势识别(Manipulation手势控制物体平移)
  2. 算法:二分查找(python版)
  3. Base64 Encoding / Decoding in Node.js
  4. &lt;转&gt;Python3.x和Python2.x的区别介绍
  5. POJ3026——Borg Maze(BFS+最小生成树)
  6. 几个字符串的误区,以及setlocale函数的使用
  7. 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)
  8. GSM Channel Mode Modify和Channel Mode Modify Acknowledge信令
  9. curl fake ip
  10. python字符串及正则表达式[转]
  11. 【转载】Office软件自定义功能区不完全显示修复方法
  12. git 推送远程仓库和删除远程仓库文件
  13. 知识在与温故、总结-再读CLR
  14. angular+webpack(二)
  15. @WebFilter怎么控制多个filter的执行顺序
  16. python接口自动化测试二十六:使用pymysql模块链接数据库
  17. 获取IOS屏幕尺寸大小
  18. VB里的 dim是什么意思?
  19. [GIT] Git 工作流程(Git flow, Github flow flow, Git lab flow)
  20. Git打Tag相关操作

热门文章

  1. SQL映射文件实现多种方式查询
  2. GCD之异步同步体会
  3. python的urlparse
  4. open() close()
  5. JS在可编辑的div中的光标位置插入内容或表情
  6. javascript-OOP基础详解
  7. winPcap编程之环境搭建(一)
  8. live555_RTSP连接建立以及请求消息处理过程
  9. Win10下python3和python2同时安装并解决pip共存问题
  10. win10 UWP Controls by function