多线程

多线程

  1. NSThread : 轻量级的方式(具有很少的规则和惯例,依赖的东西少),完全面向对象的,可以直接操控对象,但是,它的声明周期需要我们手动管理。 [NSThread cuttentThread] 可以获取到当前线程类,就可以知道当前线程的各种属性,用于调试很方便。
    优点 : 比其他两个轻量级,使用起来最直观.
    缺点 : 需要我们手动管理生命周期、线程同步;线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程).

  2. GCD : 它会自动管理生命周期(创建线程、调度任务、销毁线程)。在GCD中加入了两个概念:任务和队列。

    任务 : 有两种执行方式:同步执行异步执行。主要区别在于会不会阻塞当前线程,直到block中的任务执行完毕。

    队列:用于存放任务。有两种队列:串行队列并行队列。放到串行队列里的任务,GCD会FIFO地取出来一个,执行一个,这样一个一个的执行;放到并行队列的任务,GCD也会FIFO的取出来,但是取出来一个就会放到别的线程里,然后再取出来一个又放到另一个线程里。由于取的动作很快忽略不计,看起来所有的任务都是一起执行的。GCD会根据系统资源控制并行的数量。

    对列组 :可以将很多队列添加到一个组里,当这个组里所有的任务都执行完了,队列会通过一个方法通知我们。 dispatch_group_t

      dispatch_queue_t queue = dispatch_get_global_queue(DEFAULT_QUEUE_PRIORITY_DEFAULT, 0);  
      dispatch_group_t group = dispatch_group_create();
      dispatch_group_async(group, queue, ^{
          //下载图片
      });
      dispatch_group_async(group, queue, ^{
          //下载图片
      });
      dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
          //合并图片 
      });

    优点:自动管理生命周期(创建线程、调度任务、销毁线程);会自动根据任务在多核处理器上分配资源优化程序(对于多核运算更加有效)。使用起来最简单。性能更好。

    GCD队列分为三种:
    主队列:主线程就在这个队列中,是个串行队列;
    全局并发队列:是个并行队列,有高、默认、低和后台4个优先级;
    用户队列:是用函数 dispatch_queue_create 创建的自定义队列;

    注意:
    在主线程中,不能使用主线程队列的同步调用,这样就会发生死锁,互相等待完成。例如:

    - (void)viewDidLoad
    {
       [super viewDidLoad];
       NSLog(@"=================4");
       dispatch_sync(dispatch_get_main_queue(), ^{
          NSLog(@"=================5");
       });
       NSLog(@"=================6");
    } // 结果只会打印4,5和6都不会打印  
    sync函数等待主线程执行完成再执行block里的内容,主线程等待sync函数返回,去执行后面的内容。
  3. NSOperation和NSOperationQueue
    1 . NSoperation是苹果公司对GCD的封装,完全面向对象。可以看到NSOperationNSOperationqueue分别对应任务队列。 将要执行的任务封装到一个NSOperation对象中; 将次任务添加到一个NSOperationQueue对象中。

    2 . NSOperation是一个抽象类,所以不能封装任务,但它有2个子类用于封装任务。分别是NSInvocationOperationNSblockOperation。创建一个operation后,需要调用 start 方法来启动任务,它会默认在当前队列同步执行。但是NSBlockOperation还有一个方法: addExecutionBlock: ,通过这个方法可以给Operation添加多个执行Block。这样Operation中的任务会并发执行,它会在主线程和其他的多个线程执行这些任务。注意: addExecutionBlock 方法必须在 srart() 方法之前执行,否则就会报错。

    3 . 自定义Operation:自定义Operation需要继承NSOperation类,并实现其 main() 方法。

    4 . NSOperationQueue:按类型来说有两种类型:主队列和其他队列。只要添加到队列,会自动调用任务的 srart() 方法。

    5 . NSOperation有一个非常实用的功能,那就是添加依赖。比如有3个任务,A:从服务器上下载一张图片,B:给这张图片加个水印,C:把图片返回给服务器。这时就用到依赖了:任务二依赖任务一,任务三依赖任务二。注意:不能添加相互依赖。

    6 . 优点:不需要关心线程管理、数据同步的事情

NSOperation和GCD比较的优点:

GCD使用的API是C语言的, 抽象成NSOperationNSOperationQueue之后,代码风格统一了,不用在面向对象的OC中写面向过程的C语言代码了。
GCD不能给操作设置依赖关系以及取消操作。这些功能都已经封装到NSOperation对象里面了。
NSOperation可以设置并发操作数量。如果任务之间有依赖关系或者想要监听任务完成状态的情况下优先选择NSOperation否则使用GCD,因为苹果专门为GCD做了性能上面的优化。
NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码.

什么时候用多线程

处理需要耗时的方法,比如请求数据,图片等,对比较耗时的操作通过开启一个后台线程来处理,不阻塞主线程(卡UI)。

进程

进程指在系统中正在运行的一个应用程序(或开辟的一块空间),每个线程之间是独立的,进程是不做任务的,只有开辟了线程才能做任务的。例如:我们电脑同时打开网易云音乐和Xcode,那么系统就会分别启动两个进程。
一个进程要想执行任务,必须要有线程(每一个进程至少要有一个 线程);线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。进程之间不能共享资源,但是线程之间可以共享资源。

线程同步和异步分别是什么意思?如何实现线程的同步?

线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低。
线程异步是访问资源时在空闲等待时同时访问其他资源,实现多线程机制。
通过添加线程锁实现线程的同步。单线程不加锁可以,但是多线程的时候,对于公共资源必须加锁。当线程并发也就是异步访问,就会出现问题。所以要把异步的变成同步的才行。

如何实现多线程按顺序执行?

NSOperationQueue,可以通过添加依赖完成线程的顺序执行。
GCD有group线程组,但是group里的任务是异步执行的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了python应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值