多线程(三)
来源:互联网 发布:设计图软件 编辑:程序博客网 时间:2024/06/03 22:01
本来想写在上个多线程(二)呢,无奈GCD内容太多,暂时先写那么多
NSOperation
NSOperation 是对GCD的封装,面向对象NSOperation-> {GCD},NSOperationQueue-> dispatch_queue ,由于NSOperation是抽象类,其实现的两种方式: Selector 和 block 执行任务分别对应 NSInvocationOperation 和 NSBlockOperation
直接上代码:
Selector 方式
NSInvocationOperation * invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(methodTest) object:nil];[invocation start];NSInvocationOperation * invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(methodTest) object:nil];[invocation start];
block 方式
NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"线程%@",[NSThread currentThread]);}];//多个block 之间会并发执行,在在主线程和其它的多个线程for (int i = 0; i < 5; i++) { [operation addExecutionBlock:^{ NSLog(@"线程%@",[NSThread currentThread]); }];}[operation start];/** 2017-11-07 18:19:44.899 多线程测试[12298:367880] 线程<NSThread: 0x60800007bc80>{number = 5, name = (null)} 2017-11-07 18:19:44.899 多线程测试[12298:367883] 线程<NSThread: 0x600000078440>{number = 4, name = (null)} 2017-11-07 18:19:44.899 多线程测试[12298:367881] 线程<NSThread: 0x60800007bc40>{number = 3, name = (null)} 2017-11-07 18:19:44.900 多线程测试[12298:367883] 线程<NSThread: 0x600000078440>{number = 4, name = (null)} 2017-11-07 18:19:44.900 多线程测试[12298:367880] 线程<NSThread: 0x60800007bc80>{number = 5, name = (null)} 2017-11-07 18:19:44.899 多线程测试[12298:367781] 线程<NSThread: 0x60800006e7c0>{number = 1, name = main} */
队列(自动start)
主队列
NSOperationQueue * queue = [NSOperationQueue mainQueue];
其它队列,全部子线程
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
测试
NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"线程%@",[NSThread currentThread]);}];for (int i = 0; i < 5; i++) { [operation addExecutionBlock:^{ NSLog(@"线程%@",[NSThread currentThread]); }];}//[queue setMaxConcurrentOperationCount:1];//设置最大并发数,类似于串行[queue addOperation:operation];/** 2017-11-07 18:24:55.277 多线程测试[12356:370699] 线程<NSThread: 0x608000268700>{number = 6, name = (null)} 2017-11-07 18:24:55.277 多线程测试[12356:370685] 线程<NSThread: 0x600000263200>{number = 4, name = (null)} 2017-11-07 18:24:55.277 多线程测试[12356:370682] 线程<NSThread: 0x6080002685c0>{number = 3, name = (null)} 2017-11-07 18:24:55.277 多线程测试[12356:370683] 线程<NSThread: 0x600000263800>{number = 5, name = (null)} 2017-11-07 18:24:55.278 多线程测试[12356:370699] 线程<NSThread: 0x608000268700>{number = 6, name = (null)} 2017-11-07 18:24:55.278 多线程测试[12356:370685] 线程<NSThread: 0x600000263200>{number = 4, name = (null)} */
设置依赖
NSBlockOperation * block1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"线程1 - %@", [NSThread currentThread]);}];NSBlockOperation * block2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"线程2 - %@", [NSThread currentThread]);}];NSBlockOperation * block3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"线程3 - %@", [NSThread currentThread]);}];//Block3,block1,block2[block1 addDependency:block3];[block2 addDependency:block1];NSOperationQueue * queue = [[NSOperationQueue alloc]init];/* [block3 removeDependency:block1]; */ //解除依赖[queue addOperations:@[block1,block2,block3] waitUntilFinished:YES];NSLog(@"%@,测试",[NSThread currentThread]); //决定于上局代码是否为YES/** 2017-11-07 18:41:16.621 多线程测试[12510:379366] 线程3 - <NSThread: 0x608000262ac0>{number = 3, name = (null)} 2017-11-07 18:41:16.621 多线程测试[12510:379355] 线程1 - <NSThread: 0x600000266f00>{number = 4, name = (null)} 2017-11-07 18:41:16.622 多线程测试[12510:379355] 线程2 - <NSThread: 0x600000266f00>{number = 4, name = (null)} */
总结:
1、最大特色就是可以设置依赖和最大并发数
2、可以通过waitUntilFinish 阻塞线程
3、封装了GCD,使用起来简单
阅读全文
0 0
- 多线程同步(三)
- C++多线程(三)
- 多线程(三)Join
- 多线程总结(三)
- 多线程(三)
- c++多线程(三)
- c++多线程(三)
- java多线程(三)
- C++多线程(三)
- c++多线程(三)
- C#多线程(三)
- 浅谈-----多线程(三)
- 多线程三(交互)
- C++多线程(三)
- java多线程(三)
- java多线程(三)
- 多线程(三)
- C#多线程(三)
- 有用的查询
- Carthage 教程:开始
- 如何让已经收录的内容更有seo价值
- 带抽屉的困难版
- jsoup获取页面内容
- 多线程(三)
- HTTP Status400的原因
- Android内存泄漏产生的原因以及解决方案(OOM)
- AKKA路由策略
- goj 1446 判断栈的输出是否合法
- Kafka java api-消费者代码与消费分析、生产者消费者配置文件详解
- 自然语言处理中的Attention Model:是什么及为什么
- Caffe
- 《大话设计模式》设计模式六大原则