ationQueue 一共有两种队列:主队列、自定义队列。其中自定义队列同时包含了串行、并发功能。下边是主队列、自定义队列的基本创建方法和特点。
- 主队列
- 凡是添加到主队列中的操作,都会放到主线程中执行(注:不包括操作使用addExecutionBlock:添加的额外操作,额外操作可能在其他线程执行,感谢指正)。
- 自定义队列(非主队列)
- 添加到这种队列中的操作,就会自动放到子线程中执行。
- 同时包含了:串行、并发功能。
4.3 将操作加入到队列中
上边我们说到 NSOperation 需要配合 NSOperationQueue 来实现多线程。
那么我们需要将创建好的操作加入到队列中去。总共有两种方法:
- (void)addOperation:(NSOperation *)op;
- 需要先创建操作,再将创建好的操作加入到创建好的队列中去。
输出结果:
- 可以看出:使用 NSOperation 子类创建操作,并使用
addOperation:
将操作加入到操作队列后能够开启新线程,进行并发执行。
- (void)addOperationWithBlock:(void (^)(void))block;
- 无需先创建操作,在 block 中添加操作,直接将包含操作的 block 加入到队列中。
输出结果:
- 可以看出:使用 addOperationWithBlock: 将操作加入到操作队列后能够开启新线程,进行并发执行。
5. NSOperationQueue 控制串行执行、并发执行
之前我们说过,NSOperationQueue 创建的自定义队列同时具有串行、并发功能,上边我们演示了并发功能,那么他的串行功能是如何实现的?
这里有个关键属性 maxConcurrentOperationCount
,叫做最大并发操作数。用来控制一个特定队列中可以有多少个操作同时参与并发执行。
注意:这里 maxConcurrentOperationCount
控制的不是并发线程的数量,而是一个队列中同时能并发执行的最大操作数。而且一个操作也并非只能在一个线程中运行。
- 最大并发操作数:
maxConcurrentOperationCount
maxConcurrentOperationCount
默认情况下为-1,表示不进行限制,可进行并发执行。
maxConcurrentOperationCount
为1时,队列为串行队列。只能串行执行。
maxConcurrentOperationCount
大于1时,队列为并发队列。操作并发执行,当然这个值不应超过系统限制,即使自己设置一个很大的值,系统也会自动调整为 min{自己设定的值,系统设定的默认最大值}。