zoukankan      html  css  js  c++  java
  • iOS多线程管理-Thread,NSOperation,GCD的简单用法

    多线程

    1.程序是一个可执行文件

    2.进程是程序执行的一个操作实体

    3.进程是线程的集合

    4.多线程就是在一个程序(一个进程)中开启多条线路,为并发执行多个任务提供方便. 

    什么是线程?

    1.进程当中并发执行的代码片段

    2.线程是提高代码效率的一个手段

    3.IOS中主要用于防止界面假死

    4.线程是处理异步任务的主要手段

      

    ===============================

    NSThread

    1.+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

    作用:开启并且执行一个线程

    2.- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument 

    作用:创建一个线程但是不会执行,需要手动调用

    调用方法:[thread start];

    3.NSThreadWillExitNotification

    作用:通过通知中心监听此消息达到监听线程结束的目的

    4.NSlock 

    作用:线程锁

    #import "ViewController.h"
    
    @interface ViewController ()
    @property (nonatomic,assign)NSInteger count;
    - (IBAction)btnAction:(UIButton *)sender;
    
    @property (nonatomic,strong)NSLock *lock;//成员变量的线程锁
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.lock = [NSLock new];
        
    }
    
    
    
    - (IBAction)btnAction:(UIButton *)sender {
        //开启线程
        NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
        thread1.name = @"1号线程";
        
        //NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
        //thread2.name = @"2号线程";
        
        [thread1 start];
        //[thread2 start];
        
        [self performSelector:@selector(cancel:) withObject:thread1 afterDelay:1.5f];
        
    }
    
    //取消线程
    -(void)cancel:(NSThread *)sender{
        
        NSLog(@"cancel");
        //cancel给线程挂上取消的标志位
        [sender cancel];
        
    }
    
    -(void)refreshView{
        
        self.view.backgroundColor = [UIColor orangeColor];
    }
    
    -(void)doSomething:(id)sender{
        
        //回到主线程去刷新UI
        [self performSelectorOnMainThread:@selector(refreshView) withObject:nil waitUntilDone:NO];
        
        //同时只能有一个线程操作锁内的代码片段,如果有线程占用此代码段,其它线程只能在锁外等待
        [self.lock lock];
        for (NSInteger i = 0; i < 10; i++) {
            
            //判断一下线程是否被挂上cancel标志位
            if ([[NSThread currentThread] isCancelled]) {
                //手动退出线程
                [NSThread exit];
                
            }
            
            _count++;
            NSLog(@"%@执行了%ld",[[NSThread currentThread] name],_count);
            [NSThread sleepForTimeInterval:1.0f];
            
        }
        [self.lock unlock];
        
        
    }
    
    
    
    @end

    5.如何取消NSThread

    http://images.cnblogs.com/cnblogs_com/kenshincui/613474/o_14.jpg

    ===============================

    NSOperation

    1. NSOperation本身不是线程,它是一个线程操作

    2.它常用的子类

    1)NSInvocationOperation  通过方法指定线程要执行的任务

    2)NSBlockOperation 通过block指定要执行的任务

    3)可以继承NSOperation,然后重写main函数达到自定义任务的效果

    3.NSOperationQueue 线程池,管理线程

    可以设置最大开启的线程数 maxConcurrentOperationCount

    如果设置为1,则成为串行队列,否则,为并发队列

    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //实例化一个线程操作对象
        NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomthing:) object:nil];
        //设置如果线程执行完毕以后,回调的block函数
        [op1 setCompletionBlock:^{
            
            NSLog(@"op1执行完毕");
            
        }];
        
        //带block的NSOperation
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            //线程需要执行的代码
            
            NSLog(@"op2正在执行");
            
        }];
        
        [op2 setCompletionBlock:^{
            
            NSLog(@"op2执行完毕");
            
        }];
        
        
        MyOperation *op3 = [MyOperation new];
        
        [op3 setCompletionBlock:^{
            
            NSLog(@"op3执行完毕");
            
        }];
        
        //添加到线程池(队列)
        NSOperationQueue *queue = [NSOperationQueue new];
        //只允许开启一个线程
        //此时会变成串行任务
        queue.maxConcurrentOperationCount = 1;
        
        //添加到线程池之后,就会自动开启线程,默认是并发执行任务
        [queue addOperation:op1];
        [queue addOperation:op2];
        [queue addOperation:op3];
        
    }
    
    -(void)doSomthing:(id)sender{
        
        NSLog(@"op1正在执行");
        
    }

    ===============================

    GCD

    1.什么是GCD

    GCD 是苹果iOS4.0之后和block一起出现的技术,是苹果封装的更底层(c)更高效的多线程处理技术,GCD (grand-central-dispatch)是目前使用的最普遍的多线程处理技术,因为高效、简洁、实用

    2.GCD的队列类型

    1).主线程队列 dispatch_get_main_queue()

     

    2).子线程队列 dispatch_get_global_queue(0, 0)

     

    3.一次性执行(类似线程锁) static dispatch_once_t onceToken

    Singleton为自定义的一个继承NSObject的类,时机应用中需要什么类型就写什么类型

     

    4.延时执行 dispatch_time_t ,dispatch_after

    5.自定义队列dispatch_queue_create

    注意:自定义队列只开启一条线程,执行多个任务时为串行队列

    如下打印出来的结果都在线程"number = 2"中执行

     

    6.分组合并dispatch_group_create

     

  • 相关阅读:
    C#中get和set的写法
    FineUI中Newtonsoft.Json版本报错解决办法
    ExtAspNet和FineUI未将对象引用设置到对象的实例
    【转载】写runat="server"有什么用
    (object sender,EventArgs e)是什么?
    【转载】onclick与onCommand的区别
    简单总结------redis
    将list等分成n份
    将List 分成n个长度由调用者指定的子List
    CountDownLatch 我的应用场景
  • 原文地址:https://www.cnblogs.com/zhaohanjun/p/4649050.html
Copyright © 2011-2022 走看看