zoukankan      html  css  js  c++  java
  • 关于NSOperationQueue,一个容易让初学者误解的问题

          凡是学习NSOperationQueue的人,都会遇到setMaxConcurrentOperationCount这个函数。在网上的许多博文中,都将setMaxConcurrentOperationCount解释为“设置线程池中的线程数”,我觉得这是一种以讹传讹的说法,相当不准确,容易误导初学者,至少我曾经就被误导过。实际上,NSOperationQueue 可以认为是线程池,但setMaxConcurrentOperationCount并不是设置在其中运行的线程数,看看官方文档:

        setMaxConcurrentOperationCount: 

        Sets the maximum number of concurrent operations that the receiver can execute.

         从描述中可以看出,该函数设置的是queue里面最多能并发运行的operation个数,而不是线程个数,因为一个operation并非只能运行一个线程,看以下代码:

    -(void)test
    {
        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
            
            
            for (int i = 0; i<100;i++)
            {
                NSLog(@"%@:i=%d",[NSThread currentThread] ,i);
            }
        }];
        
        [op1 addExecutionBlock:^{
            
            for (int m = 0; m<100;m++)
            {
                NSLog(@"%@:m=%d",[NSThread currentThread],m);
            }
        }];
        
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            
            
            for (int j = 0; j<100;j++)
            {
                NSLog(@"%@:j=%d",[NSThread currentThread] ,j);
            }
        }];
        [op2 addExecutionBlock:^{
            
            for (int k = 0; k<100;k++)
            {
                NSLog(@"%@:k=%d",[NSThread currentThread],k);
            }
        }];
        
        
        
        
        NSOperationQueue *q = [[NSOperationQueue alloc]init];
        [q setMaxConcurrentOperationCount:2];
        [q addOperation:op1];
        [q addOperation:op2];
        [q setSuspended:NO];
    }

        以上代码向queue里面放入了两个operation,每个operation两个block,然后设置并发数为2,猜猜queue运行时,里面几个线程在输出log?当然不是2个,而是4个,因为blockOperation里面的block也是在不同的线程上并发运行的,因此就有4个线程在并发运行。

     

  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/gugupluto/p/3420627.html
Copyright © 2011-2022 走看看