凡是学习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个线程在并发运行。