zoukankan      html  css  js  c++  java
  • 【iOS系列】-iOS的多线程解析

    【iOS系列】-iOS的多线程解析

    iOS的多线程实现技术:

    1:GCD —— Grand Central Dispatch
    是基于C语言的底层API
    用Block定义任务,使用起来非常灵活便捷
    提供了更多的控制能力以及操作队列中所不能使用的底层函数

    2:NSOperation&NSOperationQueue
    是使用GCD实现的是面向对象的线程技术
    提供了一些在GCD中不容易实现的特性,如:限制最大并发数量、操作之间的依赖关系

    3:NSThread
    使用NSThread对象建立一个线程非常方便
    但是,要使用NSThread管理多个线程非常困难,不推荐使用
    使用[NSThread currentThread]跟踪任务所在线程

    第一:GCD

    GCD是基于C语言的底层API,是队列进行任务调度,遵循FIFO先进先出

    GCD的函数都是以dispatch开头的

    #######队列(dispatch_queue_t):

    串行队列,队列中的任务只会顺序执行
    并行队列,队列中的任务通常会并发执行

    #######操作:

    dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序
    dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序

    #######使用

    //主线程
    dispatch_queue_t q = dispatch_get_main_queue();
    
    //label:队列名称 ;attr: DISPATCH_QUEUE_SERIAL:串行 ; DISPATCH_QUEUE_CONCURRENT:并行
    dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
    
    //同步任务: queue:队列名称,block:可执行的方法
    dispatch_sync(dispatch_queue_t queue, ^(void)block);
    //异步任务:
    dispatch_async(<#dispatch_queue_t queue#>, ^(void)block);
    

    串行队列,同步任务,不需要新建线程
    串行队列,异步执行,需要一个子线程,线程的创建和回收,不需要手动参与
    --最安全的选择,【只会开一个线程】

    并行队列,同步任务,不需要创建线程,(如果当前任务在其他线程,不一定在主线程上执行)
    并行队列,异步任务,不受控制,

    无论什么队列和什么任务,线程的创建和回收不需要程序员参与。
    线程的创建回收工作是由队列负责的

    第二:NSOperation&NSOperationQueue

    NSOperationQueue有两种不同类型的队列:主队列和自定义队列

    主队列运行在主线程上

    自定义队列在后台执行【所有的自定义队列,均在子线程中运行】

    队列处理的任务是NSOperation的子类

    1:NSInvocationOperation
    2:NSBlockOperation

    定义一个队列:

     NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
         
    然后把操作NSOperation加入到队列。
    

    第一:定义NSInvocationOperation:

    //id:self  ;  SEL: @selector(方法名) ;id:方法名有参数,就填上,没有就写nil
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:(id) selector:(SEL) object:(id)];
    
    //加入到自定义的队列
    [self.queue addOperation:op];
    //加入到主队列
    [[NSOperationQueue mainQueue] addOperation:op];
    

    第二:定义NSBlockOperation:

    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^(void)block];
    
    //设置操作执行的依赖关系,执行先后顺序,
    // 设置依赖关系(op2的执行,需要op1执行后才可以执行,),依赖关系是可以跨队列:几个线程相互依赖,但是最后一个线程要更新UI(主线程才能更新UI),所以最后一个线程要在主线程上执行,但是设置的依赖关系还是不变,
    [op2 addDependency:op1];
    //加入到主队列
    [self.queue addOperation:op1];
    //加入到主队列
    [[NSOperationQueue mainQueue] addOperation:op4];
    
    //NSOperation设置最大并发的线程数,一般如果是3G,开3个子线程 ;如果是WIFI,开6个子线程
    [self.queue setMaxConcurrentOperationCount:2];
    

    可以看出:NSBlockOperation比NSInvocationOperation(只能接受一个参数)更加灵活

    第三:NSThread

    常用的方法是

    //获取当前执行的线程:
    NSThread *current = [NSThread currentThread];
    

    使用NSThread的线程,不会自动添加autoreleasepool,不能够自动回收线程,如果并发数量多,会建立大量的子线程!

  • 相关阅读:
    python基础语法
    头文件和库文件
    #pragma的用法
    C++ signal的使用
    Glog
    Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量
    /etc/ld.so.conf详解
    拿与不拿的dfs
    空白字符读取和处理
    统计频率----初始条件的设置
  • 原文地址:https://www.cnblogs.com/fengtengfei/p/4361622.html
Copyright © 2011-2022 走看看