美文网首页
多线程-NSThread NSOperation GCD

多线程-NSThread NSOperation GCD

作者: 北京的天空 | 来源:发表于2016-09-08 15:19 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/tvicsttx.html