zoukankan      html  css  js  c++  java
  • ios多线程操作(五)—— GCD串行队列与并发队列

     GCD的队列能够分为2大类型,分别为串行队列和并发队列
         串行队列Serial Dispatch Queue
         一次仅仅调度一个任务,队列中的任务一个接着一个地运行(一个任务运行完成后。再运行下一个任务)
         创建一个队列
         dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
         參数:
      const char *label:队列的名称
      dispatch_queue_attr_t attr:队列的属性。属性有两个,分别为:
         DISPATCH_QUEUE_SERIAL(NULL)   串行队列
         DISPATCH_QUEUE_CONCURRENT     并发队列
    队列属性为宏,当中串行队列的宏值为NULL。所以创建一个串行队列能够用例如以下代码
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. dispatch_queue_t q = dispatch_queue_create(“chuanXing", NULL);  
    一个串行的异步任务演演示样例如以下
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. for (int i = 0; i < 10; ++i) {  
    2.         // 10 个异步  
    3.         dispatch_async(q, ^{  
    4.             NSLog(@“%@ - %d", [NSThread currentThread],i);  
    5.         });  
    6.     }  
    7.      
    8.  NSLog(@"come here - %@“, [NSThread currentThread]);  

    运行结果例如以下


    主线程运行时间并不确定,但将10个异步任务加入的串行队列中。不管怎样都会依次一个一个运行,并且仅仅会开启一条线程
    假设将任务改为同步任务,那么执行结果可想而知(同步任务的特性)


         并发队列:
    并发队列能够让多个觉得女巫并发(同一时候)运行,它会自己主动开启多个线程同一时候运行任务,并发功能仅仅有在异步函数下才会有效,比如有例如以下代码。并行队列下运行同步任务:
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // 1. 队列  
    2.     dispatch_queue_t q = dispatch_queue_create("bingXing", DISPATCH_QUEUE_CONCURRENT);  
    3.       
    4.     // 2. 同步运行  
    5.     for (int i = 0; i < 10; ++i) {  
    6.         dispatch_sync(q, ^{  
    7.             NSLog(@"%@ %d", [NSThread currentThread], i);  
    8.         });  
    9.     }  
    10.      
    11.     NSLog(@"come here - %@",[NSThread currentThread]);  


    结果例如以下


    并发队列下运行同步函数不会创建新线程,全部任务依次在主线程上运行。

    再看看并发队列下运行异步函数
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // 1. 队列  
    2.     dispatch_queue_t q = dispatch_queue_create("itheima", DISPATCH_QUEUE_CONCURRENT);  
    3.       
    4.     // 2. 同步运行  
    5.     for (int i = 0; i < 10; ++i) {  
    6.         dispatch_async(q, ^{  
    7.             NSLog(@"%@ %d", [NSThread currentThread], i);  
    8.         });  
    9.     }  
    10.      
    11.     NSLog(@"come here - %@",[NSThread currentThread]);  

    执行结果例如以下:

    由此可知并行队列下地异步函数会开启N条子线程,且运行任务的顺序我们无法控制。至于是哪条线程运行任务由队列决定,哪个任务先完毕由CPU决定。结果中number = 4和number = 2的子线程运行了多次任务,那是由于这两条线程运行完任务就会被线程池回收,队列再从线程池中去线程运行任务。这时就会线程反复利用。假设没有线程则会又一次创建。
  • 相关阅读:
    calico 网络流量 过程 分析 apt-get install telnet
    calico 排错记录 apt-get install telnet
    kubernetes 限制网络带宽 annotation -- 注解 -- 类似 label
    vxlan 简单理解 vs calico 网络模型
    ssh配置公私钥远程登录Linux主机 + scp 免密登录ssh-copy-id 如何使用非22端口 + rsync 同步远程机器的文件到本地
    架构图+kubernetes 问题理解 -- kube-pproxy
    声明式API replica controller vs replica set 对比
    Kubernetes哪一点最打动你?或者,它发布过的哪一项特性让你认为最厉害?
    statefulSet + headless service 学习记录 service :selector --> template :label
    nodeSelector + deamonset
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7220689.html
Copyright © 2011-2022 走看看