一、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]);
});
}