关于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个线程在并发运行。

 

原文地址:https://www.cnblogs.com/gugupluto/p/3420627.html