[关闭]
@SanMao 2015-08-06T19:31:45.000000Z 字数 4365 阅读 1964

GCD

多线程


简介

任务和队列

任务执行

队列类型

各种队列执行效果

无
* 注意:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列

  1. /*
  2. 同步 + 主队列 = 需要记住的就一点: 同步函数不能搭配主队列使用
  3. 注意: 如果是在子线程中调用同步函数 + 主对列 是可以执行的
  4. */
  5. - (void)syncMian
  6. {
  7. // 主队列, 只要将任务放到主队列中, 那么任务就会在主线程中执行
  8. dispatch_queue_t queue = dispatch_get_main_queue();
  9. // 需要记住的就一点: 同步函数不能搭配主队列使用
  10. dispatch_sync(queue, ^{
  11. NSLog(@"1 - %@", [NSThread currentThread]);
  12. });
  13. dispatch_sync(queue, ^{
  14. NSLog(@"2 - %@", [NSThread currentThread]);
  15. });
  16. dispatch_sync(queue, ^{
  17. NSLog(@"3 - %@", [NSThread currentThread]);
  18. });
  19. NSLog(@"++++++++++++++");
  20. }
  21. /*
  22. 异步 + 主队列 = 不会开启新的线程
  23. */
  24. - (void)asyncMain
  25. {
  26. // 主队列, 只要将任务放到主队列中, 那么任务就会在主线程中执行
  27. dispatch_queue_t queue = dispatch_get_main_queue();
  28. // 如果任务放在主队列中, 哪怕是异步方法也不会创建新的线程
  29. dispatch_async(queue, ^{
  30. NSLog(@"1 - %@", [NSThread currentThread]);
  31. });
  32. dispatch_async(queue, ^{
  33. NSLog(@"2 - %@", [NSThread currentThread]);
  34. });
  35. dispatch_async(queue, ^{
  36. NSLog(@"3 - %@", [NSThread currentThread]);
  37. });
  38. }
  39. /*
  40. 同步 + 串行 = 不会创建新的线程
  41. 注意: 如果是同步函数, 只要代码执行到了同步函数的那一行, 就会立即执行任务, 只有任务执行完毕才会继续往后执行
  42. */
  43. - (void)syncSerial
  44. {
  45. // 1.创建队列
  46. /*
  47. 正是因为线程默认就是串行, 所以创建串行队列的时候, 队列类型可以不传值
  48. */
  49. // dispatch_queue_t queue = dispatch_queue_create("com.520it.lnj", DISPATCH_QUEUE_SERIAL);
  50. dispatch_queue_t queue = dispatch_queue_create("com.520it.lnj", NULL);
  51. // 2.添加任务
  52. dispatch_sync(queue, ^{
  53. NSLog(@"1 - %@", [NSThread currentThread]);
  54. });
  55. dispatch_sync(queue, ^{
  56. NSLog(@"2 - %@", [NSThread currentThread]);
  57. });
  58. dispatch_sync(queue, ^{
  59. NSLog(@"3 - %@", [NSThread currentThread]);
  60. });
  61. NSLog(@"%s", __func__);
  62. }
  63. /*
  64. 同步 + 并行 = 不会开启新的线程
  65. 注意: 能不能开启新的线程, 和并行/串行没有关系, 只要函数是同步还是异步
  66. */
  67. - (void)syncConcurrent
  68. {
  69. // 1.创建队列
  70. dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
  71. // 2.添加任务
  72. dispatch_sync(queue, ^{
  73. NSLog(@"1 - %@", [NSThread currentThread]);
  74. });
  75. dispatch_sync(queue, ^{
  76. NSLog(@"2 - %@", [NSThread currentThread]);
  77. });
  78. dispatch_sync(queue, ^{
  79. NSLog(@"3 - %@", [NSThread currentThread]);
  80. });
  81. NSLog(@"%s", __func__);
  82. }
  83. /*
  84. 异步 + 串行 = 会创建新的线程, 但是只会创建一个新的线程, 所有的任务都在这一个新的线程中执行
  85. 异步任务, 会先执行完所有的代码, 再在子线程中执行任务
  86. */
  87. - (void)asyncSerial
  88. {
  89. // 1.创建队列
  90. dispatch_queue_t queue = dispatch_queue_create("com.520it.lnj", DISPATCH_QUEUE_SERIAL);
  91. // 2.添加任务
  92. dispatch_async(queue, ^{
  93. NSLog(@"1 - %@", [NSThread currentThread]);
  94. });
  95. dispatch_async(queue, ^{
  96. NSLog(@"2 - %@", [NSThread currentThread]);
  97. });
  98. dispatch_async(queue, ^{
  99. NSLog(@"3 - %@", [NSThread currentThread]);
  100. });
  101. NSLog(@"%s", __func__);
  102. }
  103. /*
  104. 异步 + 并行 = 会开启新的线程
  105. */
  106. - (void)asynConcurrent
  107. {
  108. /*
  109. 第一个参数: 队列
  110. 第二个参数: 任务
  111. */
  112. // 1.创建队列
  113. /*
  114. 第一个参数: 队列的名称
  115. 第二个参数: 队列的类型
  116. */
  117. // dispatch_queue_t queue = dispatch_queue_create("com.520it.lnj", DISPATCH_QUEUE_CONCURRENT);
  118. // 其实系统内部已经给我们提供了一个现成的并发队列
  119. /*
  120. 第一个参数: iOS8以前是线程的优先级/ iOS8以后代表服务质量
  121. iOS8以前
  122. * - DISPATCH_QUEUE_PRIORITY_HIGH: 2
  123. * - DISPATCH_QUEUE_PRIORITY_DEFAULT: 0
  124. * - DISPATCH_QUEUE_PRIORITY_LOW: -2
  125. * - DISPATCH_QUEUE_PRIORITY_BACKGROUND: -32768
  126. iOS8开始, 取值都是十六进制
  127. * - QOS_CLASS_USER_INTERACTIVE 用户交互(用户迫切的想执行任务, 不要在这种服务质量下做耗时的操作)
  128. * - QOS_CLASS_USER_INITIATED 用户需要
  129. * - QOS_CLASS_DEFAULT 默认(重置队列)
  130. * - QOS_CLASS_UTILITY 实用工具(耗时的操作放在这里)
  131. * - QOS_CLASS_BACKGROUND
  132. * - QOS_CLASS_UNSPECIFIED 没有设置任何优先级
  133. 第二个参数: 系统保留的参数, 永远传0
  134. */
  135. // 1.获取全局的并发队列
  136. dispatch_queue_t queue = dispatch_get_global_queue(0 , 0);
  137. // 2.添加任务到队列
  138. // 文档说明是FIFO原则, 先进先出
  139. // 打印结果不正确的原因: 线程的执行速度可能不一样, 有得快一些, 有的慢一些
  140. dispatch_async(queue, ^{
  141. NSLog(@"1 - %@", [NSThread currentThread]);
  142. });
  143. dispatch_async(queue, ^{
  144. NSLog(@"2 - %@", [NSThread currentThread]);
  145. });
  146. dispatch_async(queue, ^{
  147. NSLog(@"3 - %@", [NSThread currentThread]);
  148. });
  149. NSLog(@"%s", __func__);
  150. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注