zoukankan      html  css  js  c++  java
  • IOS多线程(NSThread,NSOperation,Grand Central Dispatch)

    •NSThread:

      –优点:NSThread 比其他两个轻量级,使用简单
      –缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
     
    •NSOperation

       –不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上

       –NSOperation是面向对象的

       - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

    •如果要更新UI界面,可以在后台线程中调用performSelectorOnMainThread方法
     
    •提示:尽管使用performSelectorInBackground方法调用的任务可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是要使用performSelectorOnMainThread   方法,以避免不必要的麻烦
     
    •开启后台执行任务的方法
     
      -(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
     
    •在后台线程中通知主线程执行任务的方法
     
      –(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
     
    •获取线程信息
     
      [NSThread currentThread];
     
    •线程休眠
     
      [NSThread sleepForTimeInterval:1.0f];
     
     
     + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
     - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
    •detachNewThreadSelector方法会直接启动线程方法
    •initWithTarget需要调用start方法才能够启动线程方法
    •参数说明:
      –selector:线程执行的方法,只能有一个参数,不能有返回值
      –target:selector消息发送的对象
      –argument:传输给target的唯一参数,也可以是nil
     
    •NSOperation的两个子类
      1.NSInvocationOperation
      2.NSBlockOperation
    •工作原理:
      1.用NSOperation封装要执行的操作
      2.将创建好的NSOperation对象放NSOperationQueue中
      3.启动OperationQueue开始新的线程执行队列中的操作
    •注意事项:
      1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢
      2.使用以下方法可以控制并发的线程数量:
    -(void)setMaxConcurrentOperationCount:(NSInteger)cnt;
     
    NSInvocation/NSBlockOperation演练
     
     
    通过addDependency建立线程之间的联系 / 限制线程数量
    •GCD队列:
      –Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
      –GCD是基于C语言的
    GCD的优点:
      –充分利用多核
      –所有的多线程代码集中在一起,便于维护
      –GCD中无需使用@autoreleasepool
      -如果要顺序执行,可以使用dispatch_sync同步方法
      -dispatch_async无法确定任务的执行顺序
     
    1.全局队列:所有添加到主队列中的任务都是并发执行的
      •全局队列(可能会开启多条线程)
      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    2.串行队列:所有添加到串行队列中的任务都是顺序执行的
      •串行队列(只可能会开启一条线程)
      dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
    3.主队列:所有添加到主队列中的任务都是在主线程中执行的
      •主队列
      dispatch_get_main_queue();

     •异步操作

       –dispatch_async 在其他线程执行任务,会开启新的线程

       –异步方法无法确定任务的执行顺序 

    •同步操作

       –dispatch_sync 在当前在当前线程执行任务,不开启新的线程

      –同步操作与队列无关
     
      –同步方法会依次执行,能够决定任务的执行顺序
     
      –更新界面UI时,最好使用同步方法

    GCD就是为了在多核上使用多线程技术

         1> 要使用GCD,所有的方法都是dispatch开头的

         2> 名词解释

         global  全局

         queue   队列

         async   异步

         sync    同步 

         3> 要执行异步的任务,就在全局队列中执行即可

          dispatch_async 异步执行控制不住先后顺序

         4> 关于GCD的队列

          全局队列    dispatch_get_global_queue

         参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT

         始终是 0

         串行队列    dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

         是创建得到的,不能直接获取

         主队列      dispatch_get_main_queue

         5> 异步和同步与方法名无关,与运行所在的队列有关!

         提示:要熟悉队列于同步、异步的运行节奏,一定需要自己编写代码测试!同步主要用来控制方法的被调用的顺序

     
     
     
     
    ---------------------线程锁-------------------
     
     
     
    ---------------------通过NSBlockOperation内存缓存-------------------
     
     
     
    ---------------------内存管理-------------------
     
     
     
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/BinShao/p/zhibin.html
Copyright © 2011-2022 走看看