【问题标题】:What is the difference between 'thread' and 'queue' in iOS development? [duplicate]iOS开发中的“线程”和“队列”有什么区别? [复制]
【发布时间】:2014-04-19 05:29:09
【问题描述】:

我是 iOS 开发新手。现在我对“线程”和“队列”这两个概念感到很困惑。我所知道的是它们都是关于多线程编程的。谁能为我解释这两个概念以及它们之间的区别? 提前致谢!

【问题讨论】:

标签: ios objective-c multithreading oop queue


【解决方案1】:

NSOperationQueue 和 NSThread 是如何工作的:

NSThread:

  1. iOS 开发人员必须为他想要执行的工作/进程编写代码,同时创建和管理线程本身。
  2. iOS 开发人员必须小心使用线程的行动计划。
  3. iOS 开发人员必须自行管理可能出现的问题,例如线程的可重用性、锁定等。
  4. 线程也会消耗更多内存。

NSOperationQueue:

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

如何使用 NSThread 和 NSOperationQueue:

NSThread:

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

NSOperationQueue:

  1. 当您想要同时运行更复杂的操作时,请使用 NSOperationQueue。
  2. NSOperation 允许子类化、依赖关系、优先级、取消,并且支持许多其他更高级别的功能。
  3. NSOperation 实际上在底层使用 GCD,因此它与 GCD 一样具有多核、多线程能力。

现在您应该了解 NSTread 和 NSOperation 的优缺点了。您可以根据应用程序的需要使用它们中的任何一个。

【讨论】:

    【解决方案2】:

    在您阅读我的答案之前,您可能需要考虑阅读此内容 - Migrating away from Threads

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

    消息队列是一种数据结构,用于保存从发送消息到接收者检索并对其采取行动的消息。通常,队列被用作“连接”生产者(数据)和消费者(数据)的一种方式。

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

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

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

    示例:

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

    如果您触摸屏幕上的按钮,UI 线程会将触摸事件分派给应用程序,然后应用程序设置其按下状态并向事件 queue 发送请求。 UI 线程将请求出列并通知小部件重绘自身。

    【讨论】:

    • 还在打坐……但是你的链接很有帮助。谢谢你的回答。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多