- (void)asyTest{
// 创建线程
NSThread *thread = [[NSThread alloc]initWithTarget:self
selector:@selector(test)
object:nil];
[NSThread detachNewThreadSelector:@selector(test)
toTarget:self
withObject:nil];
// 获取当期线程
NSThread *currentThread = [NSThread currentThread];
// 主线程相关
NSThread *mainThread = [NSThread mainThread];
BOOL isMainThread = [mainThread isMainThread];
// 线程优先级
CGFloat priority = [currentThread threadPriority];
[currentThread setThreadPriority:5.0];
while (1) {
// 使用对象锁,一次只能一个对象访问
@synchronized(self) {// 只能加一把锁
[NSThread exit];
break;
}
}
// 异步GCD
// 使用全军并发队列,默认优先级
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 串行队列
dispatch_queue_t synQueue = dispatch_queue_create("队列名称",NULL);
dispatch_sync(synQueue, ^{
});
dispatch_async(dispatch_get_main_queue(), ^{
});
});
// 组队列
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});
// NSOperation
/**
NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程
NSOperation和NSOperationQueue实现多线程的具体步骤:
(1)先将需要执行的操作封装到一个NSOperation对象中
(2)然后将NSOperation对象添加到NSOperationQueue中
(3)系统会⾃动将NSOperationQueue中的NSOperation取出来
(4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏
2.NSOperation的子类
NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类
使用NSOperation⼦类的方式有3种:
(1)NSInvocationOperation
(2)NSBlockOperation
(3)自定义子类继承NSOperation,实现内部相应的⽅法
*/
//操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
[operation start];
//只要NSBlockOperation封装的操作数 > 1,就会异步执行操作
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
}];
// 添加操作
[blockOperation addExecutionBlock:^{
}];
[blockOperation start];
/**
.NSOperationQueue
NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的
如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作
添加操作到NSOperationQueue中,自动执行操作,自动开启线程
注意:系统自动将NSOperationqueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务是并行执行的。
提示:队列的取出是有顺序的,与打印结果并不矛盾。这就好比,选手A,BC虽然起跑的顺序是先A,后B,然后C,但是到达终点的顺序却不一定是A,B在前,C在后。
*/
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation];
[queue addOperation:blockOperation];
// 第二种
[queue addOperationWithBlock:^{
NSLog(@"ddd");
}];
/**
一、并发数
(1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3
(2)最大并发数:同一时间最多只能执行的任务的个数。
(3)最⼤大并发数的相关⽅方法
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。
注意:num的值并不代表线程的个数,仅仅代表线程的ID。
提示:最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。
*/
[queue cancelAllOperations];
[queue setSuspended:YES];
NSLog(@"%d",[queue isSuspended]);
// 暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种情况,就可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。
[operation addDependency:blockOperation];// 操作operation依赖blockOperation
// 可以在不同的queue的操作之间建立依赖关系,切记不能循环依赖
// 可以监听一个操作是否完成
operation.completionBlock = ^{
};
// 把任务添加到队列中,自动执行,自动开启线程
[queue addOperation:operation];
}