zoukankan      html  css  js  c++  java
  • 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];
    }
    

      

  • 相关阅读:
    IntelliJ Idea 常用快捷键列表
    IPv6地址存储
    一文看懂java的IO流
    AchartEngine的柱状图属性设置
    绘制图表改变其大小
    在Android上用AChartEngine轻松绘制图表
    Android 图表绘制 achartengine 示例解析
    封装一个类搞定90%安卓客户端与服务器端交互
    安卓图表引擎AChartEngine(三)
    AchartEngine 的学习
  • 原文地址:https://www.cnblogs.com/yinyakun/p/3580915.html
Copyright © 2011-2022 走看看