多线程总结
来源:互联网 发布:网络舆情分析师培训 编辑:程序博客网 时间:2024/06/06 01:57
2014年11月8日 上海 杨树浦路 小雨
下午,复习多线程
iOS多线程的实现方法有4种
1.系统自带
系统自带多线程使用只有一句代码,将任务放到后台运行。
[self performSelectorInBackground:@selector(task1) withObject:nil];
2.NSThread
NSThread的使用有两种
1. 创建对象,对象必须调用 start 方法调用
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(task1) object:nil]; [thread start];
2.类方法调用
[NSThread detachNewThreadSelector:@selector(task1) toTarget:self withObject:nil];
3.NSOperation
1.和 NSThread 类似,使用对象方法,必须调用 start 方法调用
NSInvocationOperation *io1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task1) object:nil]; [io1 start];
2.放到 NSOperation 线程
NSOperationQueue *oq = [[NSOperationQueue alloc] init]; [oq addOperation:io1];可以给进程队列中的任务开始前添加一些操作
[oq addOperationWithBlock:^{ NSLog(@"任务开始");<span style="white-space:pre"></span>// 任务开始前先执行 }];
4.GCD
GCD 必须熟练掌握
- (void)gcd{ // 创建线程队列 /** * 创建一个线程队列类型 * * @param "chenbing" 队列名称,用于标识 * @param DISPATCH_QUEUE_CONCURRENT 并行队列(异步队列) DISPATCH_QUEUE_SERIAL 串行队列(同步队列)(默认) * */ dispatch_queue_t qt = dispatch_queue_create("chenbing", DISPATCH_QUEUE_CONCURRENT); dispatch_async(qt, ^{ [self task1]; }); dispatch_async(qt, ^{ [self task2]; }); dispatch_async(qt, ^{ [self task3]; }); /** * dispatch_sync 队列任务增加方法为同步,不管创建的队列时同步还是异步,都是以同步执行,(即一个任务完成,再执行第二个任务) * * dispatch_async 队列任务增加方法为异步,但是要看队列类型为同步还是异步,如果队列类型为同步,则任务还是以同步执行。 * * 同步运行所有任务的情况:队列为同步队列,或者任务是同步加到队列中的 */ /** * 一般使用系统自带队列 * * 系统自带队列有多少个!! 5个, 一个主线程队列,4个对应不同优先级的全局异步队列 #define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN typedef long dispatch_queue_priority_t; // 获取默认优先级的全局并发dispatch queue dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 第一个参数用于指定优先级,分别使用DISPATCH_QUEUE_PRIORITY_HIGH和DISPATCH_QUEUE_PRIORITY_LOW两个常量来获取高和低优先级的两个queue;第二个参数目前未使用到,默认0即可 */ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self task1]; }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self task2]; }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ [self task3]; }); // 标准用法 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"子线程开始"); // 在子类写子线程的内容,在这里做子线程的任务 NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://image16-c.poco.cn/mypoco/myphoto/20140605/18/17457026820140605181136033_640.jpg?570x300_120"]]; dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"主线程开始"); // 任务完成后,回到主线程队列,进行UI刷新 UIImage *img = [UIImage imageWithData:data]; UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; imgView.image = img; [self.view addSubview:imgView]; }); }); }- (void)gcdGroup{ // 线程组:在线程组内所有的任务完成后,执行其他任务 // 组会监测所有任务的完成状态 // 创建一个线程组 dispatch_group_t gt = dispatch_group_create(); // 创建一个线程队列 dispatch_queue_t qt = dispatch_queue_create("chen", DISPATCH_QUEUE_CONCURRENT); // 将任务放到线程队列中执行,同时放到线程组中管理 dispatch_group_async(gt, qt, ^{ [self task1]; }); dispatch_async(qt, ^{ sleep(5); NSLog(@"taskAdd--->%@", [NSDate date]); }); dispatch_group_async(gt, qt, ^{ [self task2]; }); dispatch_group_async(gt, qt, ^{ [self task3]; }); // 监测gt线程组中的任务,完成后,执行这个任务,并将此任务放到qt线程队列中 dispatch_group_notify(gt, qt, ^{ NSLog(@"所有任务执行完成"); NSLog(@"task----%@",[NSDate date]); }); }- (void)barrier{ // 分组运行,需要中断,即在这个段的前面为一组任务,中断点后面也是一组任务 // 条件必须创建 DISPATCH_QUEUE_CONCURRENT 并行(异步)类型的线程队列 dispatch_queue_t qt = dispatch_queue_create("chen", DISPATCH_QUEUE_CONCURRENT); dispatch_async(qt, ^{ [self task1]; }); dispatch_async(qt, ^{ [self task2]; }); // 在所有任务中间中断,执行其他任务 dispatch_barrier_async(qt, ^{ NSLog(@"中断---->%@", [NSDate date]); }); dispatch_async(qt, ^{ [self task3]; }); dispatch_async(qt, ^{ [self task1]; });}- (void)time{ /** * 时间 * * @param DISPATCH_TIME_NOW 当前时间 * @param NSEC_PER_SEC 距离当前时间点时间点 * */ dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull* NSEC_PER_SEC ); // 创建一个线程,并让其在固定的时间后执行 dispatch_after(time, dispatch_get_main_queue(), ^{ self.view.backgroundColor = [UIColor blueColor]; });}
0 0
- 多线程总结--多线程介绍
- 多线程_多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结:
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 多线程总结
- 关于Lasso回归的一个例子
- C++学习与实践(三):类
- JavaScript学习 5.2.5 重排序方法
- Ajax学习(三)——XMLHttpRequest对象的五步使用法
- 第十一周项目四:特殊三位数
- 多线程总结
- TrustRank算法
- 正则表达式基础知识01
- asp.net--JQUERY使用
- mysql 开启慢查询
- 贝叶斯集锦:贝叶斯派和频率派的一个例子
- Ext Spket在Eclipse/MyEclipse下的安装和配置(图文教程)
- Sequential Consistency浅谈
- 大竟-历届卷-三-2-古堡算式