线程管理四种方法

进程:程序在计算机的一次执行活动,一个程序就是一个进程,iOS中一个app就是一个进程

线程:程序执行的最小单元,一个进程中至少有一个线程(主线程)


一. 通过NSObject的方法管理线程   

       这个方法会帮助我们自动开辟一个后台线程,不需要自己创建   

       参数:(1)在这个后台线程中执行的方法   

    参数:(2)用于传递参数,没有为nil   

[self performSelectorInBackground:@selector(banZhuanPlus) withObject:nil];

}


二.通过NSTread方法管理线程
    参数:(1)方法的执行者,(2)在线程中的执行的方法,(3)用于传递参数,没有为nil    

    1.创建线程   

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(banZhuanPlus) object:nil];

    2.执行   

      [thread start];   

      [thread release];


.通过NSOperationQueue方法管理线程
   NSOperation是操作单元,用来执行方法,是一个抽象类,必须子类化或者使用系统创建好的子类:NSInvocationOperation,NSBlockOperation
    NSOperation,是最小的操作单元,只能执行一次

第一步,创建操作单元(两种方法)
  1.1  NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(banZhuanPlus) object:nil];  1.2  NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
                     主线程中执行

          [self banZhuanPlus];   

}];       

       2.创建队列

         队列会自动创建一个辅助的线程;
    队列里面能添加NSOperation及子类的对象

NSOperationQueue *queue = [[NSOperationQueue alloc] init];       

         最大并行数设置,同时执行几个操作单元   

    [queue setMaxConcurrentOperationCount:1];   

    3.执行,只要把操作单元添加到队列中,它就会执行   

    [queue addOperation:block];   

    [queue addOperation:invocation];


.通过GCD方法管理线程
GCD:Grand Central Dispatch,大中央调度,Apple推崇的多线程管理策略,是通过队列对多线程进行管理
    1.创建队列(三种方法)

          第一种队列   

  dispatch_queue_t mainQueue = dispatch_get_main_queue();//主调队列,在主线程中执行,并且是串行(一次操作一个)       

          第二种队列   

          全局队列,在子线程中执行,并且是并行(一次可以执行多个);   

          参数:(1)设置队列的优先级(high, default,low,background);(2)预留参数,未来使用      

     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   


          第三种队列   

         自定义队列,在子线程中执行,可以设置并行或者串行   

         参数:(1)区分队列的唯一标识可选项,如果不写:NULL;如果写,规范例子”com.example.myqueue".   

         参数:(2)设置并行或者串行的

并行 :DISPATCH_QUEUE_CONCURRENT;

串行:DISPATCH_QUEUE_SERIAL(or NULL)   

     dispatch_queue_t customQueue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);


2.执行(三种方法)

第一种,同步执行(需要等待执行完毕)

参数:(1)指定队列,(2)Block,执行的操作   

      dispatch_sync(globalQueue, ^{       

          [self banZhuanPlus];//执行的操作

    });

第二种,异步执行(无需等待)   

    dispatch_async(globalQueue, ^{      

        [self banZhuanPlus];//执行的操作

});

第三种,延迟执行
参数:(1)要延迟执行的时间,(2)//执行的操作

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{       

        [self banZhuanPlus];  

 });


五.线程中注意点

第一,如果是在MRC模式下,线程中的autorelease对象不能释放,必须手动释放,或者添加自动释放池


第二,子线程中刷新UI可能会失败(在子线程中不要刷新UI,即改变此UI的设置与属性)           

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。