iOS 多线程研究

今天谈到多线程,那么就来说说多线程。

多线程简介。

第一、为什么使用多线程?

第二、怎么使用多线程?

第三、多线程都有哪些实现方式?

第四、多线程之间怎么实现通信的?

第五、使用多线程有什么缺点?有什么优点?

第六、使用多线程中应该注意什么?

 

下面一点一点来进行解决:

线程简介:

首先需要理解进程和线程这2个概念。

所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令)。一个进程至少包含一条线程,线程是程序的执行流。
•iOS程序启动时,在创建一个进程的同时, 会开始运行一个线程,该线程被称为主线程
系统中的每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则共用进程的内存空间
•每创建一个新的线程,都会消耗一定内存和CPU时间
•当多个线程对同一个资源出现争夺的时候需要注意线程安全问题

第一、为什么使用多线程?

将耗时、轮询或者并发需求高等任务分配到其他线程执行,并由主线程负责统一更新界面会使得应用程序更加流畅,用户体验更好,例如网络请求,播放游戏的背景音乐等。
第二、怎么使用多线程?
第三、多线程的实现方式?

IOS 中的多线程包括一下三种方法:NSThread,NSOpreation,GCD(grand central dispatch).

先来看看NSThread:

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];  
NSThread* myThread = [[NSThread alloc] initWithTarget:self  
                                        selector:@selector(doSomething:)  
                                        object:nil];  
[myThread start];  

selector :线程执行的方法,这个selector只能有一个参数,而且不能有返回值。

target  :selector消息发送的对象

argument:传输给target的唯一参数,也可以是nil

第一种方式会直接创建线程并且开始运行线程,第二种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息。

再看看NSOperation:

NSOperation和NSOperationQueue

  NSOperation 这个类必须要继承并重写里面的方法,才能够使用,不能直接使用NSOperation来实例化对象。

  1、一个继承自  NSOperation的操作类,该类的实现中必须有 - (void)main方法的。

  2、使用NSOperation的最简单方法就是将其放入NSOperationQueue中。

    一旦一个操作被加入队列,该队列就会启动并开始处理它(即调用该操作类的main方法)。一旦该操作完成队列就会释放它。

     self.queue = [[NSOperationQueue allocinit];

      ArticleParseOperation *parser = [[ArticleParseOperation allocinitWithData:filePath delegate:self];

      [queue addOperation:parser];

  3、可以给操作队列设置最多同事运行的操作数: [queue setMaxConcurrentOperationCount:2];

     

 

线程同步

在以下两种基本情况下,线程之间需要相互通信:

  • 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性;
  • 一个线程需要通知其它线程某项任务已经完成

什么情况下使用线程同步:

基本思路是,首先要创建公用的NSCondition实例。

使用NSCondition,实现多线程的同步,即,可实现生产者消费者问题。

  • 消费者取得锁,取产品,如果没有,则wait,这时会释放锁,直到有线程唤醒它去消费产品;
  • 生产者制造产品,首先也是要取得锁,然后生产,再发signal,这样可唤醒wait的消费者。
- (IBAction)didClickTest:(id)sender {
    _publicCondition = [[NSCondition alloc]init];
    _products = [[NSMutableArray alloc] init];

    NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(didClickCreateSCZ:) object:nil];
   
    NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(didClickCreateXFZ:) object:nil];
    [thread1 start];
    [thread2 start];
    
}
- (IBAction)didClickCreateSCZ:(id)sender {
    [_publicCondition lock];
    while ([_products count] == 0) {
        NSLog(@"wait for products");
        [_publicCondition wait];
    }
    [_products removeObjectAtIndex:0];
    NSLog(@"comsume a product");
    [_publicCondition unlock];
}

- (IBAction)didClickCreateXFZ:(id)sender {
    [_publicCondition lock];
    [_products addObject:[[NSObject alloc] init]];
    NSLog(@"produce a product");
    [_publicCondition signal];
    [_publicCondition unlock];
}

  

 

posted @ 2014-03-04 18:36  lanacon  Views(166)  Comments(0Edit  收藏  举报