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,所以创建一个串行队列能够用例如以下代码
    dispatch_queue_t q = dispatch_queue_create(“chuanXing", NULL);
    一个串行的异步任务演演示样例如以下
    for (int i = 0; i < 10; ++i) {
            // 10 个异步
            dispatch_async(q, ^{
                NSLog(@“%@ - %d", [NSThread currentThread],i);
            });
        }
       
     NSLog(@"come here - %@“, [NSThread currentThread]);

    运行结果例如以下


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


         并发队列:
    并发队列能够让多个觉得女巫并发(同一时候)运行,它会自己主动开启多个线程同一时候运行任务,并发功能仅仅有在异步函数下才会有效,比如有例如以下代码,并行队列下运行同步任务:
    // 1. 队列
        dispatch_queue_t q = dispatch_queue_create("bingXing", DISPATCH_QUEUE_CONCURRENT);
        
        // 2. 同步运行
        for (int i = 0; i < 10; ++i) {
            dispatch_sync(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
       
        NSLog(@"come here - %@",[NSThread currentThread]);


    结果例如以下


    并发队列下运行同步函数不会创建新线程,全部任务依次在主线程上运行。
    再看看并发队列下运行异步函数
    // 1. 队列
        dispatch_queue_t q = dispatch_queue_create("itheima", DISPATCH_QUEUE_CONCURRENT);
        
        // 2. 同步运行
        for (int i = 0; i < 10; ++i) {
            dispatch_async(q, ^{
                NSLog(@"%@ %d", [NSThread currentThread], i);
            });
        }
       
        NSLog(@"come here - %@",[NSThread currentThread]);

    执行结果例如以下:

    由此可知并行队列下地异步函数会开启N条子线程,且运行任务的顺序我们无法控制。至于是哪条线程运行任务由队列决定。哪个任务先完毕由CPU决定。结果中number = 4和number = 2的子线程运行了多次任务,那是由于这两条线程运行完任务就会被线程池回收,队列再从线程池中去线程运行任务,这时就会线程反复利用。假设没有线程则会又一次创建。





  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5139081.html
Copyright © 2011-2022 走看看