iOS开发iOSA知识点2

iOS实录16:GCD小结之控制最大并发数

2017-07-23  本文已影响2266人  南华coder

导语:在GCD的使用中,需要考虑控制最大并发数线程同步这两个问题,本文主要介绍GCD中如何控制最大并发数

一、概述

1、GCD并发的困扰
2、优雅的NSOperationQueue

说明:NSOperationQueue使用详见多线程编程3 - NSOperationQueueNSOperation

3、我们该怎么办

二、QSDispatchQueue方案

1、GCD的信号量机制(dispatch_semaphore)
执行结果.png

说明:从执行结果中可以看出,虽然将10个任务都异步加入了并发队列,但是信号量机制控制了最大线程并发数,始终是3个线程在执行任务。此外,这些任务也没有阻塞主线程。

2、QSDispatchQueue方案的实现

1)直接在代码中使用GCD的信号量,不够优雅,代码也很冗余;基于此,QSDispatchQueue方案出来了。(代码很简单,一共两个文件)

2)QSDispatchQueue方法声明如下:

//QSDispatchQueue.h
@interface QSDispatchQueue : NSObject

#pragma mark - main queue + global queue
/**
 全局并发队列的最大并发数,默认4
 */
+ (QSDispatchQueue *)mainThreadQueue;

+ (QSDispatchQueue *)defaultGlobalQueue;

+ (QSDispatchQueue *)lowGlobalQueue;

+ (QSDispatchQueue *)highGlobalQueue;

+ (QSDispatchQueue *)backGroundGlobalQueue;

#pragma mark -
@property (nonatomic,assign,readonly)NSUInteger concurrentCount;

- (instancetype)init;

/**
 默认最大并发数是1
 @param queue 并发队列
 */
- (instancetype)initWithQueue:(dispatch_queue_t)queue;

/**
 @param queue 并发队列
 @param concurrentCount 最大并发数,应大于1
 */
- (instancetype)initWithQueue:(dispatch_queue_t)queue
              concurrentCount:(NSUInteger)concurrentCount;

//同步
- (void)sync:(dispatch_block_t)block;

//异步
- (void)async:(dispatch_block_t)block;

@end
3、QSDispatchQueue方案的使用
dispatch_queue_t workConcurrentQueue = dispatch_queue_create("cccccccc", DISPATCH_QUEUE_CONCURRENT);
QSDispatchQueue *queue = [[QSDispatchQueue alloc]initWithQueue:workConcurrentQueue concurrentCount:3];
for (NSInteger i = 0; i < 10; i++) {
    [queue async:^{
        NSLog(@"thread-info:%@开始执行任务%d",[NSThread currentThread],(int)i);
        sleep(1);
        NSLog(@"thread-info:%@结束执行任务%d",[NSThread currentThread],(int)i);
    }];
}
NSLog(@"主线程任务...");

执行结果如下图:

QSDispatchQueue方案执行结果.png

说明:从执行结果中来看,通过QSDispatchQueue方案也到达了最大线程并发数的目的。

三、小结

End

上一篇下一篇

猜你喜欢

热点阅读