zoukankan      html  css  js  c++  java
  • iOS的多线程技术

    iOS的三种多线程技术                    

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)
    2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题
    ØNSOperation/NSOperationQueue 面向对象的线程技术
    ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 

    以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的,在项目中很多框架技术分别使用了不同多线程技术。 

    2.三种多线程技术的对比                     

    •NSThread:
    –优点:NSThread 比其他两个轻量级,使用简单
    –缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
     
    •NSOperation:
    –不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
    –NSOperation是面向对象的
     
    •GCD:
    –Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
    –GCD是基于C语言的

    3.GCD中有三种队列类型:

    1. The main queue: 与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。
    2. Global queues: 全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
    3. 用户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列,所以我们称其为用户队列) 是用函数 dispatch_queue_create 创建的队列. 这些队列是串行的。正因为如此,它们可以用来完成同步机制, 有点像传统线程中的mutex。

    串行队列同步:操作不会新建线程、操作顺序执行

    串行队列异步:操作需要一个子线程,会新建线程、线程的创建和回收不需要程序员参与,操作顺序执行,“最安全的选择”

    并行队列同步:操作不会新建线程、操作顺序执行

    并行队列异步:操作会新建多个线程(有多少任务,就开n个线程执行)、操作无序执行;队列前如果有其他任务,会等待前面的任务完成之后再执行;场景:既不影响主线程,又不需要顺序执行的操作!

    全局队列异步:操作会新建多个线程、操作无序执行,队列前如果有其他任务,会等待前面的任务完成之后再执行。相当于串行队列。

    全局队列同步:操作不会新建线程、操作顺序执行

    主队列异步:操作都应该在主线程上顺序执行的,不存在

    4,。不同队列嵌套dispathch_sync(同步)任务的结果:

    // 1.全局队列,都在主线程上执行,不会死锁 dispatch_queue_priority_default

    dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

    // 2.并行队列,都在主线程上执行,不会死锁 dispatch_queue_concurrent

    dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_concurrent);

    // 3.串行队列,会死锁,但是会执行嵌套同步操作之前的代码 dispatch_queue_serial

    dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_serial);

    // 4.主队列,直接死锁 dispatch_get_main_queue();

    dispatch_queue_t q = dispatch_get_main_queue();

    dispatch_sync(q, ^{

        nslog(@"同步任务 %@", [nsthread currentthread]);

        dispatch_sync(q, ^{

            nslog(@"同步任务 %@", [nsthread currentthread]);

        });

    });

     

  • 相关阅读:
    递延收益为什么属于负债类科目
    java 环境变量脚本
    dotnet 执行命令常用代码
    centos安装nuget
    centos 安装nodejs redis
    linux git 记住密码
    libgit2-6311e88: cannot open shared object file: No such file or directory
    angular ng build 报错 Cannot read property 'default' of undefined
    java ObjectMapper json 与对象的相互转换
    java 流不能复用 stream has already been operated upon or closed 内存分页
  • 原文地址:https://www.cnblogs.com/pengsi/p/5110716.html
Copyright © 2011-2022 走看看