zoukankan      html  css  js  c++  java
  • 线程管理四种方法

    进程:程序在计算机的一次运行活动,一个程序就是一个进程,iOS中一个app就是一个进程

    线程:程序运行的最小单元,一个进程中至少有一个线程(主线程)


    一. 通过NSObject的方法管理线程   

           这种方法会帮助我们自己主动开辟一个后台线程,不须要自己创建   

           參数:(1)在这个后台线程中运行的方法   

        參数:(2)用于传递參数,没有为nil   

    [self performSelectorInBackground:@selector(banZhuanPlus) withObject:nil];

    }


    二.通过NSTread方法管理线程
        參数:(1)方法的运行者,(2)在线程中的运行的方法,(3)用于传递參数,没有为nil    

        1.创建线程   

        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(banZhuanPlus) object:nil];

        2.运行   

          [thread start];   

          [thread release];


    .通过NSOperationQueue方法管理线程
       NSOperation是操作单元,用来运行方法,是一个抽象类,必须子类化或者使用系统创建好的子类:NSInvocationOperation,NSBlockOperation
        NSOperation,是最小的操作单元,仅仅能运行一次

    第一步,创建操作单元(两种方法)
      1.1  NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(banZhuanPlus) object:nil];  1.2  NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
                         主线程中运行

              [self banZhuanPlus];   

    }];       

           2.创建队列

             队列会自己主动创建一个辅助的线程;
        队列里面能加入�NSOperation及子类的对象

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];       

             最大并行数设置,同一时候运行几个操作单元   

        [queue setMaxConcurrentOperationCount:1];   

        3.运行,仅仅要把操作单元加入�到队列中,它就会运行   

        [queue addOperation:block];   

        [queue addOperation:invocation];


    .通过GCD方法管理线程
    GCD:Grand Central Dispatch,大中央调度,Apple推崇的多线程管理策略,是通过队列对多线程进行管理
        1.创建队列(三种方法)

              第一种队列   

      dispatch_queue_t mainQueue = dispatch_get_main_queue();//主调队列,在主线程中运行,而且是串行(一次操作一个)       

              另外一种队列   

              全局队列,在子线程中运行,而且是并行(一次能够运行多个);   

              參数:(1)设置队列的优先级(high, default,low,background);(2)预留參数,未来使用      

         dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   


              第三种队列   

             自己定义队列,在子线程中运行,能够设置并行或者串行   

             參数:(1)区分队列的唯一标识可选项,假设不写:NULL;假设写,规范样例”com.example.myqueue".   

             參数:(2)设置并行或者串行的

    并行 :DISPATCH_QUEUE_CONCURRENT;

    串行:DISPATCH_QUEUE_SERIAL(or NULL)   

         dispatch_queue_t customQueue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);


    2.运行(三种方法)

    第一种,同步运行(须要等待运行完成)

    參数:(1)指定队列,(2)Block,运行的操作   

          dispatch_sync(globalQueue, ^{       

              [self banZhuanPlus];//运行的操作

        });

    另外一种,异步运行(无需等待)   

        dispatch_async(globalQueue, ^{      

            [self banZhuanPlus];//运行的操作

    });

    第三种,延迟运行
    參数:(1)要延迟运行的时间,(2)//运行的操作

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{       

            [self banZhuanPlus];  

     });


    五.线程中注意点

    第一,假设是在MRC模式下,线程中的autorelease对象不能释放,必须手动释放,或者加入�自己主动释放池


    第二,子线程中刷新UI可能会失败(在子线程中不要刷新UI,即改变此UI的设置与属性)           
  • 相关阅读:
    QSetting
    类中函数前、后、参数加const
    delete指针
    自定义数组类
    手动调用构造函数
    windows和linux平台下的通用时间测试函数
    多线程编程学习
    Android 利用ImageView显示图片
    特征描述算子-sift
    opencv边界扩展
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4003610.html
Copyright © 2011-2022 走看看