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

 

 

posted on 2015-07-15 17:42  ZhaoHanjun  阅读(207)  评论(1编辑  收藏  举报

导航