zoukankan      html  css  js  c++  java
  • IOS多线程的小总结

    ios中多线程的实现方案有4种
        1.pthread :一套通用的多线程API/适用于UnixLinuxWindows等系统 (跨平台可移植/使用难度大)    C语言    几乎不用
        2.NSThread :使用更加面向对象/简单易用,可直接操作线程对象          程序管理(线程生命周期)    OC语言    偶尔使用
        3.GCD     :旨在替代NSThread等多线程技术/充分利用设备的多核      自动管理            C语言    经常使用
        4.NSOperation:基于GCD(底层GCD)/比GCD多一些简单的使用功能/使用更加面向对象    自动管理       OC语言    经常

    打印线程标志number ,主线程为1 :  [NSThread  currentThread]

    3种方式创建线程   (新建的都是子线程)
        1>NSthread  oc   开发人员控制(管理)[线程的创建和销毁]    3中方法创建的线程执行@selelct(方法)   工作中很少用
            1>NSThread  *thread=[NSThread  alloc]initWithTarget:self  selector :@selector(add)  object:nil];       
            调用add方法
            必须调用   [thread  start];
                2.[self  perFormSelectorInBackGround:@select(add) withObject:nil]
            3.[NSThread  detachNewThreadSelector:@selelct(add) toTarget:self  withObject:nil]
        2>gcd       纯c   线程系统自动管理,充分利用多核技术        经常使用
        3>操作         基于gcd 的oc的实现方式              经常使用

    线程同步,多线调用同一个方法(例add)在方法中加一把锁(锁对象,要求线程使用的都是同一把锁)
        加锁之后,就是当一个线程执行完之后再执行另外一个线程
        如不加锁,线程会随机(在缓存池中去找线程)调用
    @synchronized(self)
    {//加锁
        for(int i0;i<100;i++){
            NSLOg(@“%@”,[NSThread currentThread]);
        }
    }//解锁

    线程之间的通讯(交互,在新创建的子线程中调用方法,在方法中使用主线程去做一些事情,就产生了线程的通信)
        1.创建子线程[self performSelectorInBackground:@selector(downLoadImage) withObject:nil];调用downLoadImage方法
        2.在downLoadImage方法中使用主线程去下载图片[self performSelectorOnMainThread:@selector(displayPhoto:) withObject:img waitUntilDone:NO];
        3.在displayPhoto:方法中显示-(void)displayPhoto:(UIImage *)img     {self.photoView.image=img;}


    gcd中有操作和队列两种方法,操作分为(同步和异步),队列分为(并发[一次执行多个block]和串行[一次只能一个block执行]).
    常见搭配是:1.异步并发
           dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//获取全局并发队列
           异步操作:dispatch_async(queue, ^{   NSLog(@"%@",[NSThread currentThread]);   });
             2.异步+主队列
           dispatch_queue_t queue=dispatch_get_main_queue();//获取主队列
               异步操作:dispatch_async(queue, ^{   NSLog(@"%@",[NSThread currentThread]);  });
         3.异步+串行
           dispatch_queue_t queue=dispatch_queue_create("com", NULL);//创建了一个串行队列
           异步操作:dispatch_async(queue, ^{   NSLog(@"%@",[NSThread currentThread]);  });
         4.同步+并发
           dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//获取全局并发队列
           同步操作:dispatch_sync(queue, ^{   NSLog(@"%@",[NSThread currentThread]);  });

      GCD通信(创建个全局并发/串行队列,在同步/异步队列中,创建主线程来显示)

    NSOperation   NSOperationQueue *queue=[[NSOperationQueue alloc] init];
        添加依赖(就是设置 NSBlockOperation 创建多个b1,b2,b3)
           NSBlockOperation *b1=[NSBlockOperation blockOperationWithBlock:^{  NSLog(@"1"); }];
        [b3 addDependency:b2];   [b2 addDependency:b1];  只有当b1执行完执行b2  b1->b2->b3
        再一次将b1,b2,b3添加到 NSOperation上  queue addOperation:b1/b2/b3

        通信和上边一样,在新创建的线程NSOperation中获取主线程操作

  • 相关阅读:
    js配置文件路径和项目目录文件夹位置的一致性
    MyBatis DTD文件下载地址
    Maven安装问题
    WebService客户端(以命令方式创建)
    Error configuring application listener of class org.springframework.web.cont
    HashMap与LinkedHashMap的区别
    同一台电脑配置多个JBoss
    WebService之客户端
    【solvebug】Java反射报错java.beans.IntrospectionException: Method not found,lombok的@Accessors注解
    【运维】windows server 2008 R2 Standard中如何安装 mysql8.0
  • 原文地址:https://www.cnblogs.com/mawenqiangios/p/4994238.html
Copyright © 2011-2022 走看看