为了账号安全,请及时绑定邮箱和手机立即绑定

NSThread、NSOperationQueue、 GCD等多线程编程技术的应用场景

标签:
数据结构

首先我们了解什么是多线程。

程序 :一个由源代码 生成的可执行应用(比如QQ,微信...)
进程:一个正在运行的程序可以看成一个进程,进程负责去向手机系统申请资源,同时将这些资源调度 给我们的线程
线程:可以看成是可以运行的代码段,这些代码段需要的资源,比如内存,都需要去向进程申请.
多线程,拥有多个线程的程序叫做多线程程序
单线程,只有一个线程的程序叫做单线程程序,如果是单线程则肯定是主线程
除了主线程之外的线程都是子线程
只有一个主线程
子线程之间是并行执行的,也就是说是同时执行的

  • NSThread
    NSThread 比其他两个轻量级,需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。

    //创建一个线程,并指定一个这个线程中要做的事件
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(for100000ByThread) object:nil];
    thread.name = @"我是线程";
    // 激活我们创建的线程,开始工作
    [thread start];
    //线程睡眠一段时间
    [NSThread sleepForTimeInterval:5];

  • Cocoa NSOperation
    不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。 Cocoa operation相关的类是NSOperation, NSOperationQueue.
    NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子
    类: NSInvocationOperation和NSBlockOperation. 创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。

//利用NSBlockOperation 去创建一个操作
NSBlockOperation blockOperation = [NSBlockOperation blockOperationWithBlock:^{
//这个操作要干得事情
[self action];
}];
//模拟一个文件下载
NSBlockOperation
fileDownload = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"开始下载文件--%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:0.1];
NSLog(@"下载完成%@",[NSThread currentThread]);
}];
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//最大同步数 放置在添加操作之前,这样才会生效
queue.maxConcurrentOperationCount = 2;
//我们向队列中添加操作后,队列会自动去让操作进入一个子线程区去操作,至于去哪个子线程就是队列干得事情了,不需要我们去指定,任务进入线程是随机的,
//向队列中添加操作
[queue addOperation:blockOperation];
[queue addOperation:fileDownload];

  • Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。在iOS4.0开 始之后才能使用。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation 等技术的很高效和强大的技术。现在的iOS系统都升级到7了,所以不用担心该技术不能使用。

    //GCD 队列分2种,
    //serial (串行队列) : 一次只能执行一个任务,必须上一个任务执行完,下一次任务才开始,遵循 FIFO 原则 --> 哪个任务先进入这个队列就先执行
    //concurrent (并行队列) : 队列会根据当前系统的情况(内存...)来创建子线程,同时将这些任务进行分发
    //dispatch_queue_t 一个队列
    //GCD 为我们提供了一个主队列 dispatch_get_main_queue
    //这个队列主要运行在主线程中
    //dispatch_queue_t queue = dispatch_get_main_queue();
    //主队列中是串行,在主队列中添加的任务必须依次执行。


http://forums.fami2u.com/t/nsthread-nsoperationqueue-gcd/66

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
58
获赞与收藏
773

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消