zoukankan      html  css  js  c++  java
  • GCD使用 并行串行队列同步异步执行组合情况

    1、异步函数和并行队列

    注意:这些任务都是在创建完之后才执行。异步函数+并发队列,可以新建线程,各线程也是并发执行的。

     1 //第一种:系统方法创建并发队列(全局队列)
     2     /**
     3      *  <#Description#>
     4      *
     5      *  @param identifier#> 优先级(有四个) description#>
     6      *  @param flags#>      系统保留关键字,暂时写0 description#>
     7      *
     8      *  @return <#return value description#>
     9      */
    10     dispatch_queue_t queueSys = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    11     
    12     //第二种:自己方法创建
    13     dispatch_queue_t queueO = dispatch_queue_create("queueO", DISPATCH_QUEUE_CONCURRENT);
    //并发 + 异步  number = 3, name = (null) 也就是说异步开启子线程
        dispatch_async(queueSys, ^{
            NSLog(@"并发 + 异步 %@",[NSThread currentThread]);
        });

    2、同步函数+并发队列

    注意:这些任务都是创建一个就立马执行,执行完才创建下一个,因为是同步函数,所以不新建线程,只要是同步函数,就不会新建线程。并发队列与否,并不影响同步函数的创建,因为本身就不能多创建线程,也就不存在并发

    //并发 + 同步
        dispatch_sync(queueSys, ^{
            NSLog(@"并发 + 同步 %@",[NSThread currentThread]);
        });

    3、异步函数+串行队列

    注意:这个搭配可以新建线程,但是因为是串行队列,所以实际上也只是开了一条新线程,做完一个,再做另一个。

     1 //第一种:系统提供的串行队列方式(串行队列中比较实用,常用在开发中)
    注意:因为主队列是串行队列,而且是主线程执行的,只要加到主队列就一定是加载主线程,不论是同步还是异步
    2 dispatch_queue_t queue = dispatch_get_main_queue();//主队列 3 4 //第二种: 5 dispatch_queue_t queue1 = dispatch_queue_create("queue", 0); 6 7 //将任务添加到队列当中 8 //串行队列 + 异步任务:只开一个子线程 9 dispatch_async(queue1, ^{ 10 NSLog(@"串行 + 异步 %@",[NSThread currentThread]); 11 }); 12 13 /** 14 * 线程锁死 15 * 原因1:dispatch_sync在等待任务执行完成,但是任务又被添加到主线程里,所以在主线程里执行,所以dispatch_syn在主线程中调用,就会造成锁死 16 dispatch_queue_t queue = dispatch_get_main_queue();//主队列 17 dispatch_sync(queue1, ^{ 18 NSLog(@"串行 + 同步 %@",[NSThread currentThread]); 19 }); 20 * 原因2:dispatch_sync是同步的,本身就会阻塞线程,就是主线程,往现在又网主线程里添加任务,就会发生锁死,所以不用系统自带主队列创建,用create

    嵌套也会卡死

            

    //串行队列 + 同步任务:
        dispatch_sync(queue1, ^{
           //串行队列 + 同步任务:
            dispatch_sync(queue1, ^{
                NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
            });
            NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
        });
    21      *  @return <#return value description#>
    22      */

    4、同步函数+串行

    注意:这样既不会开新线程,也是串行执行的

    //串行队列 + 同步任务:
        dispatch_sync(queue1, ^{
            NSLog(@"串行 + 同步 %@",[NSThread currentThread]);
        });
  • 相关阅读:
    硅谷独角兽公司的监控系统长啥样?
    通过jQuery设置全局Ajax加载时呈现Loading
    Jquery遮罩插件,想罩哪就罩哪!
    jquery 读取textarea内容
    easy ui layout 高度 宽度自适应浏览器
    css调节样式
    ORACLE数据库的连接
    spring cloud API网关
    嵌套查询与连接查询的性能
    对于where 1=1 这种条件传入需要'%s'
  • 原文地址:https://www.cnblogs.com/mingmenqiaochu/p/5885707.html
Copyright © 2011-2022 走看看