4种多线程

来源:互联网 发布:linux按文件大小排序 编辑:程序博客网 时间:2024/05/13 01:49

 

 

1. NSThread

    1>类方法 detachNewThreadSelector

        直接启动线程,调用选择器方法

  

    2>成员方法 initWithTarget

        需要使用start方法,才能启动实例化出来的线程

  

    优点:简单

    缺点:

        *控制线程的生命周期比较困难

        *控制并发线程数

        *存在死锁隐患

        *先后顺序困难

        例如:下载图片(后台线程) ->滤镜美化(后台线程) ->更新UI(主线程)

  

 2. NSOperation

    1> NSInvocationOperation

    2> NSBlockOperation

  

    定义完Operation之后,将操作添加到NSOperationQueue即可启动线程,执行任务

  

    使用:

    1> setMaxConcurrentOperationCount可以控制同时并发的线程数量

    2>  addDependency可以指定线程之间的依赖关系,

                      从而达到控制线程执行顺序的目的,如先下载,再渲染图片

  

    提示:

    要更新UI,需要使用[NSOperationQueuemainQueue]addOperationWithBlock:

    在主操作队列中更新界面

  

 3. GCD

     1)全局global队列,如果是同步,则不开线程,在主队列中执行

     方法:dispatch_get_global_queue(获取全局队列)

     优先级:DISPATCH_QUEUE_PRIORITY_DEFAULT

     所有任务是并发(异步)执行的

      

     2)串行队列  必须开一条新线程,全是顺序执行的

     方法:dispatch_queue_create(创建串行队列,串行队列不能够获取)

     提示:队列名称可以随意,不过不要使用@

      

     3)主队列

     主线程队列

     方法:dispatch_get_main_queue(获取主队列)

  

    gcd中,同步还是异步取决于任务执行所在的队列,更方法名没有关系

  

    具体同步、异步与三个队列之间的关系,一定要反复测试,体会!

     

  4.全局队列(可能会开启多条线程,如果是同步方法,则不开线程,只在主线程里)

        dispatch_queue_t queue =dispatch_get_global_queue(

                        DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

        串行队列(只可能会开启一条线程)

        dispatch_queue_t queue =dispatch_queue_create("myQueue",

                                        DISPATCH_QUEUE_SERIAL);

        主队列

        dispatch_get_main_queue();

 

    异步操作

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

         

 

    同步操作

        dispatch_sync同步方法会依次执行,能够决定任务的执行顺序

        同步操作与队列无关,所有的队列的同步,都是顺序执行的

        更新界面UI时,最好使用同步方法

 

    GCD的优点:

        充分利用多核

        所有的多线程代码集中在一起,便于维护

        GCD中无需使用@autoreleasepool

 

        如果要顺序执行,可以使用dispatch_sync同步方法

        dispatch_async无法确定任务的执行顺序

        调用主线程队列任务更新UI时,最好使用同步方法

    单例:

        保证在内存中永远只有类的单个实例

 

        建立方法:

        1,声明一个静态成员变量,记录唯一实例

        2,重写allocWithZone方法

            allocWithZone方法是对象分配内存空间时,最终会调用的方法,

            重写该方法,保证只会分配一个内存空间

        3,建立sharedXXX类方法,便于其他类访问

0 0
原创粉丝点击