首页 > 代码库 > ios中的多线程的用法总结

ios中的多线程的用法总结

ios中的多线程的用法总结

1、进程的基本概念

(1)每一个进程都是一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况

(2)同一个进程的线程共享内存中的内存和资源

2、多线程的基本概念

(1)每一个程序都有一个主线程,程序启动时创建(调用main来启动)。

(2)多线程技术表示,一个应用程序有多个线程,使用多线程能提供CPU的利用率,防止主线程被堵塞。

(3)任何有可能堵塞主线程的任务不要在主线程执行(如:访问网络)。

(4)主线程的生命周期和应用程序绑定着,程序退出(结束)时,主线程也结束。

3、多线程的创建

                    /* 方法一*/   

    //第一种开启新的线程调用 threadFunction

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

    [thread start];

                      /*方法二:*/

    [NSThread detachNewThreadSelector:@selector(threadFunction) toTarget:self withObject:nil];

                       /*方法三:*/

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

 /*方法四:*/

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

    [operationQueue addOperationWithBlock:^(void){

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

            NSLog(@"多线程的运行");

        }

        

    }];

                   /*方法五:*/

    //创建一个线程队列

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

    //设置线程执行的并发数

    operationQueue.maxConcurrentOperationCount = 1;

    //创建一个线程操作对象

    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(mutableThread1:) object:nil];

    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(mutableThread2:) object:nil];

    //设置线程的优先级

    operation2.queuePriority = NSOperationQueuePriorityHigh;

    //将线程添加到线程队列中去

    [operationQueue addOperation:operation1];

    [operationQueue addOperation:operation2];

        }

    

   /*第六种方法*/

GCD

GCD是Grand Central Dispatch的缩写,是一系列的BSD层面的接口,在Mac 10.6 和iOS4.0以后才引入的,且现在NSOperation和NSOperationQueue的多线程的实现就是基于GCD的。目前这个特性也被移植到 FreeBSD上了,可以查看libdispatch这个开源项目。


    //创建一个队列

    dispatch_queue_t queue =dispatch_queue_create("test",NULL);

//创建异步进程

    dispatch_async(queue, ^{

dispatch_sync(dispatch_get_main_queue(),^{

});

    });


  4、NSRunLoop的用法 

(1)Runloop是与线程有关的基础框架的一部分,是用来规划事件处理的,当有任务的时候Runloop会让线程处理任务,当没有任务的时候Runloop会让线程处于休眠状态。
(2)Runloop的管理不完全是自动的,我们必须在合适的时候开启Runloop和处理到达的事件,Cocoa和Core Foundation都提供了Runloop对象来配置和管理线程的Runloop。我们的应用程序不需要显示的创建这些对象,包括应用主线程在内的每一个线程都有一个相关的Runloop对象。而且只有第二线程是需要显示地运行Runloop,主线程是不需要的,APP把主线程Runloop的配置和运行作为了应用程序启动的一部分。

(3)NSRunLoop可以一直保持一个线程一直为活跃状态,不会马上销毁掉。

(4)操作Runloop的两个接口: 1.NSRunLoop Class Reference 2.CFRunLoop Reference

  5、定时器在多线程的使用

      在多线程中使用定时器必须开启RunLoop,因为只有开启RunLoop保持线程为活动状态,才能保持定时器能不断执行。  

    代码:

  [selfperformSelectorInBackground:@selector(makeThread )withObject:nil];

- (void)mulitiThread{

    

    /*方法一:此方式创建的timer添加至NSRunLoop*/

      [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];

      //开启NSRunLoop来使线程保持存活状态

     [[NSRunLoop currentRunLoop]run];

     */

    

    /*方法二:此方式创建的timer没有添加至NSRunLoop*/

    NSTimer *timer = [NSTimertimerWithTimeInterval:1target:selfselector:@selector(timeAction)userInfo:nilrepeats:YES];

    [[NSRunLoopcurrentRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

    [[NSRunLoopcurrentRunLoop]run];

    NSLog(@"线程结束");

}


- (void)timeAction{

    NSLog(@"timeAction");

}