iOS开发中'thread'和'queue'有什么区别?

时间:2014-04-19 05:29:10

标签: ios objective-c multithreading oop queue

我是iOS开发的新手。现在我对这两个概念感到很困惑:" thread"和"队列"。我所知道的是,它们都是关于多线程编程的。任何人都能解释这两个概念以及它们之间的区别吗? 提前谢谢!

2 个答案:

答案 0 :(得分:21)

NSOperationQueue和NSThread如何运作:

NSThread:

  1. iOS开发人员必须为他想要执行的工作/流程编写代码,以便创建和管理线程本身。
  2. iOS开发人员必须小心使用线程的行动计划。
  3. iOS开发人员必须自己管理可靠的问题,如线程的可重用性,锁定等。
  4. 线程也会占用更多内存。
  5. NSOperationQueue:

    1. NSOperation类是一个抽象类,它封装了与单个任务相关的代码和数据。
    2. 开发人员需要使用子类或NSOperation的系统定义子类之一来执行任务。
    3. 将操作添加到NSOperationQueue中以执行它们。
    4. NSOperationQueue为每个操作创建一个新线程,并按照添加的顺序运行它们。
    5. 操作队列处理所有线程管理,确保尽可能快速有效地执行操作。
    6. 操作队列直接通过在辅助线程上运行操作或间接使用GCD(Grand Central Dispatch)执行操作。
    7. 它负责所有内存管理并大大简化了流程。
    8. 如果您不想使用操作队列,还可以通过调用其start方法来执行操作。它可能会使您的代码过于复杂。
    9. 如何使用NSThread和NSOperationQueue:

      NSThread:

      1. 虽然操作队列是同时执行任务的首选方式,但根据应用程序的不同,您可能仍需要创建自定义线程。
      2. 线程仍然是实现必须实时运行的代码的好方法。
      3. 将线程用于无法以任何其他方式实现的特定任务。
      4. 如果您需要从后台运行的代码中获得更多可预测的行为,则线程仍可提供更好的替代方案。
      5. NSOperationQueue:

        1. 当您希望同时运行更复杂的操作时,请使用NSOperationQueue。
        2. NSOperation允许子类化,依赖关系,优先级,取消以及支持许多其他更高级别的功能。
        3. NSOperation实际上在引擎盖下使用GCD,因此它像GCD一样具有多核,多线程。
        4. 现在您应该了解NSTread和NSOperation的优缺点。您可以根据应用程序的需要使用其中任何一个。

答案 1 :(得分:14)

在您阅读我的回答之前,您可能需要考虑阅读本文 - Migrating away from Threads

我保持讨论的理论性,因为您的问题没有任何代码示例。这两种结构都是提高应用响应能力所必需的。可用性。

消息队列是一种数据结构,用于在消息发送时将消息保留到接收方检索并对其进行操作的时间。通常,队列用作“连接”生产者(数据)和“生成”的方式。消费者(数据)。

线程池是执行某种处理的线程池。线程池通常会附加某种线程安全队列(引用消息队列),以允许您排队要完成的作业。这里的队列通常被称为“任务队列”。

因此,线程池可能存在于生产者端(生成数据)或消费者端(处理数据)。而“传递”数据的方式是通过队列。为什么需要这个“中间人” -

  1. 它解耦系统。生产者不了解消费者和消费者。反之亦然。
  2. 如果生产者数据出现峰值,消费者不会被数据轰炸。队列长度会增加,但消费者是安全的。
  3. 示例:

    在iOS中,主线程(也称为UI线程)非常重要,因为它负责将事件分派给适当的小部件,这包括绘图事件,基本上是用户看到的UI和。交互。

    如果触摸屏幕上的按钮,UI线程会将触摸事件发送到应用程序,然后应用程序会设置其按下状态并将事件发送到事件队列。 UI线程将请求出列并通知窗口小部件重绘自己。