多线程-NSThread NSOperation GCD

1.NSThread NSOperation,GCD发展的历程是从早到晚的,NSThread是比较轻量级的,NSOperation是对GCD的封装,GCD比较简单易用,也是苹果比较提倡和推荐的一种方式

2.NSThread控制线程的状态比较复杂,NSThead的创建主要有两种方式:

- (instancetype)init NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;

- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);

当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

前两种方法创建后,需要手机启动,启动的方法是:

- (void)start;

3.NSOperation有一个“线程池”(NSOperationQueue)的概念,他可以设置最大线程数和线程彼此间的依赖的关系,比较容易控制优先级。

使用NSOperation⼦类的方式有3种:

(1)NSInvocationOperation

(2)NSBlockOperation

(3)自定义子类继承NSOperation,实现内部相应的⽅法

注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

4.GCD有一个类似NSOperationQueue的队列dispatch_queue_t,GCD中的队列分为串行和并行队列

串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行

dispatch_queue_t queue_s = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

并行队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。

dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);

GCD还有一个队列组dispatch_group_t

dispatch_group_t group = dispatch_group_create();

举例:

通过一个并发的队列创建一个队列组

dispatch_queue_t queue = dispatch_queue_create("com.gcd-group.www", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_enter(group);

dispatch_group_async(group, queue, ^{

for (int i = 0; i < 10; i++) {

//            if (i == 9) {

                    NSLog(@"11111111");

//            }

}

});

dispatch_group_leave(group); //所有的11111111都打印完成后,执行其他异步队列组线程队列

dispatch_group_async(group, queue, ^{

NSLog(@"22222222");

});

dispatch_group_async(group, queue, ^{

NSLog(@"33333333");

});

dispatch_group_notify(group, queue, ^{

NSLog(@"done");

});

你可能感兴趣的:(多线程-NSThread NSOperation GCD)