#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor whiteColor];
//GCD
// [self test1];
// [self queueGroup];
// [self blockOperation];
[self operationQueue];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)test1{
//DISPATCH_QUEUE_CONCURRENT 表示创建并行队列
//DISPATCH_QUEUE_SERIAL 表示创建串行队列
// dispatch_queue_t queue=dispatch_queue_create("Eric", DISPATCH_QUEUE_SERIAL);
//全局并行队列:这应该是唯一一并行队列,只要是并行任务一般都加入到这个队列
// dispatch_queue_t queue2=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//同步任务:不会另开线程(sync)
//异步任务:会另开线程(async)
}
/*!
* 队列组:队列组可以将很多队列添加到一个组里,这样做的好处是,当这个组所有的任务都执行完了,队列组会通过一个方法通知我们。这是一个很实用的功能
*/
-(void)queueGroup{
//1.创建队列组
dispatch_group_t group=dispatch_group_create();
//2.创建队列
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//3.多次使用队列组的方法执行任务,只有异步方法
dispatch_group_async(group, queue, ^{
for (NSInteger i=0; i<3; i++) {
NSLog(@"group-01-%@",[NSThread currentThread]);
}
});
dispatch_group_async(group, dispatch_get_main_queue(), ^{
for (NSInteger i=0; i<8; i++) {
NSLog(@"group-02-%@",[NSThread currentThread]);
}
});
dispatch_group_async(group, queue, ^{
for (NSInteger i=0; i<5; i++) {
NSLog(@"group-03-%@",[NSThread currentThread]);
}
});
//4.队列组中的任务都完成后会自动通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"完成 - %@",[NSThread currentThread]);
});
}
-(void)blockOperation{
//NSBlockOperation默认会在当前线程执行。但是 NSBlockOperation 还有一个方法:addExecutionBlock: ,通过这个方法可以给 Operation 添加多个执行 Block。这样operation中的任务会并发执行,它会在主线程和其它多个线程中执行这些任务
//1.创建NSBlockOperation对象
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
// 添加多个Block
for (NSInteger i=0; i<5; i++) {
[operation addExecutionBlock:^{
NSLog(@"第%ld次:%@",i,[NSThread currentThread]);
}];
}
//开始任务
[operation start];
//NOTE:addExecutionBlock 方法必须在 start() 方法之前执行,否则就会报错:
}
-(void)operationQueue{
// //因为主队列比较特殊,所以会单独有一个类方法来获得主队列。那么通过初始化产生的队列就是其他队列了,因为只有这两种队列,除了主队列,其他队列就不需要名字了。
// //注意:其他队列的任务会在其他线程并行执行
//
// //1.创建一个其他队列
// NSOperationQueue *queue=[[NSOperationQueue alloc] init];
// //2.创建NSBlockOperation对象
// NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
// //3.添加多个Block
// for (NSInteger i=0; i<5; i++) {
// [operation addExecutionBlock:^{
// NSLog(@"第%ld次:%@",i,[NSThread currentThread]);
// }];
// }
//设置最大并发数 当设置为1时 就变成串行
queue.maxConcurrentOperationCount=1;
// //4.队列添加到任务
// [queue addOperation:operation];
//NSBlockOperation还有一个非常实用的功能,那就是添加依赖。比如有 3 个任务:A: 从服务器上下载一张图片,B:给这张图片加个水印,C:把图片返回给服务器。这时就可以用到依赖了:
//1.任务一:下载图片
NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片 - %@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
}];
//2.任务二:打水印
NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"打水印 - %@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
}];
//3.任务三:上传图片
NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"上传图片 - %@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.0];
}];
//4.设置依赖
//任务二依赖任务一
[operation2 addDependency:operation1];
//任务三依赖任务二
[operation3 addDependency:operation2];
//5.创建队列并加入任务
NSOperationQueue *queue=[[NSOperationQueue alloc] init];
//参数二:NSOperationQueue是并行的,所以加入该队列的任务都会在其他线程并行执行,不会阻塞主线程。但如果参数二为YES的话主线程会阻塞,直到queue中的任务执行完成
[queue addOperations:@[operation1,operation2,operation3] waitUntilFinished:NO];
NSLog(@"完成");
}
@end
多线程(二)
最新推荐文章于 2022-10-30 16:00:07 发布