iOS:多线程、队列使用

一、NSThread使用:

//获取当前线程名称

[NSThread currentThread]

//暂停几秒

[NSThread sleepForTimeInterval:5.0f];

 

 

二、NSOperation/NSOperationQueue使用:

说明:

使用GCD实现的OC的API,性能比GCD略低

分主队列和自定义队列

主队列:在主线程中执行(UI线程)

自定义队列:在后台子线程中执行

使用:

1.使用自定义队列(在后台子线程中执行):

//定义自定义队列
@property (nonatomic, strong) NSOperationQueue *custemQueue;

/*
 1.NSOperation方式1:自定义队列:在后台子线程中执行
 */
- (void)nsoperationCustemQueue{
    if(self.custemQueue == nil){
        //创建自定义队列(后台子线程中执行)
        self.custemQueue = [[NSOperationQueue alloc] init];
        //设置最大并发线程数
        [self.custemQueue setMaxConcurrentOperationCount:1];
    }
    
    NSLog(@"当前main线程为: %@", [NSThread currentThread]);
    
    //执行任务
    [self operation1:self.custemQueue];
}

2.使用主队列(在主线程中执行(UI线程)):

/*
 1.NSOperation方式2:使用主队列:在主线程中执行(UI线程)
 */
- (void)nsoperationMainQueue{
    NSLog(@"当前main线程为: %@", [NSThread currentThread]);
    
    //获取主队列
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    
    //执行任务
    [self operation1:mainQueue];
}

3.创建并执行任务:

(1)方式1:

/*
 2.创建与执行任务方式1
 */
- (void)operation1:(NSOperationQueue *)queue{
    //创建任务1
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1 后台,当前线程为: %@", [NSThread currentThread]);
    }];
    
    //创建任务2
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"2 后台,当前线程为: %@", [NSThread currentThread]);
    }];
    
    //设置执行顺序(支持跨队列),参数中的op2先执行,添加者op1后执行,不设置默认按addOperation的顺序执行
//    [op1 addDependency:op2];
    
    //将任务加入队列中,按addOperation的顺序执行,受addDependency影响
    [queue addOperation:op1];
    [queue addOperation:op2];
}

(2)方式2:

/*
 2.创建与执行任务方式2
 */
- (void)operation2:(NSOperationQueue *)queue{
    //将任务加入队列中,并执行
    [queue addOperationWithBlock:^{
        NSLog(@"main,当前线程为: %@", [NSThread currentThread]);
    }];
}

(3)方式3:

/*
 2.创建与执行任务方式3:(1)创建任务,并调用自定义方法执行代码
 */
- (void)operation3:(NSOperationQueue *)queue{
    //创建任务
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(performOP) object:@"opId"];
    //将任务加入队列中,并执行
    [queue addOperation:op];
}
/*
 2.创建与执行任务方式3:(2)执行代码
 */
- (void)performOP{//接收上面方式3的事件
    NSLog(@"main,当前线程为: %@", [NSThread currentThread]);
}

 

三、GCD(Grand Central Dispatch)使用:

说明:

基于C语言底层API

队列名称:dispatch_queue_t

异步执行:dispatch_async

同步执行:dispatch_sync

规则:

串行、并行队列+同步执行,会在main线程执行,顺序执行

串行队列+异步任务,只会创建一个子线程,顺序执行

并行队列+异步任务,会创建多个子线程,并发执行

main队列不能执行同步,否则会死锁

同步任务不能嵌套同步任务,否则会死锁

使用:

1.创建队列管理线程:

/*
 1.gcd方式1:创建队列管理线程
 */
- (void)gcdCreateQueue{
    //1.创建队列
    //串行队列,一个线程,并且线程按顺序执行:DISPATCH_QUEUE_SERIAL
    //串行队列+同步时
    dispatch_queue_t queue = dispatch_queue_create("queueId", DISPATCH_QUEUE_SERIAL);
    //并行队列,多个线程并发执行:DISPATCH_QUEUE_CONCURRENT
//    dispatch_queue_t queue = dispatch_queue_create("queueId", DISPATCH_QUEUE_CONCURRENT);
    
    NSLog(@"当前main线程为: %@", [NSThread currentThread]);
    
    //2.异步执行
    [self asyncThread:queue];
    
    //2.同步执行
    [self syncThread:queue];
}

2.使用系统全局自带的队列管理线程:

/*
 1.gcd方式2:使用系统全局自带的队列管理线程
 */
- (void)gcdGlobalQueue{
    //1.获取系统自带全局队列
    //并行队列,多个线程并发执行:DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    NSLog(@"当前main线程为: %@", [NSThread currentThread]);
    
    //2.异步执行
    [self asyncThread:queue];
    
    //2.同步执行
    [self syncThread:queue];
}

3.使用main队列(更新UI操作):

/*
 1.gcd方式3:使用main队列(更新UI操作)
 */
- (void)gcdMainQueue{
    //1.获取主线程main队列
    //顺序执行,不能执行同步,否则会死锁
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    NSLog(@"当前main线程为: %@", [NSThread currentThread]);
    
    //2.在主线程main队列中不存在异步,只会顺序执行
    [self asyncThread:queue];
}

4.异步执行:

/*
 2.异步执行
 */
- (void)asyncThread:(dispatch_queue_t)queue{
    //2.执行异步线程(在子线程中执行)
    dispatch_async(queue, ^{
        NSLog(@"异步, 当前线程为: %@", [NSThread currentThread]);
    });
}

5.同步执行:

/*
 2.同步执行
 */
- (void)syncThread:(dispatch_queue_t)queue{
    //2.执行同步线程(在main线程中执行)
    dispatch_sync(queue, ^{
        NSLog(@"同步, 当前线程为: %@", [NSThread currentThread]);
    });
}

 

你可能感兴趣的:(iOS)