【问题标题】: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:
- iOS 开发人员必须为他想要执行的工作/进程编写代码,同时创建和管理线程本身。
- iOS 开发人员必须小心使用线程的行动计划。
- iOS 开发人员必须自行管理可能出现的问题,例如线程的可重用性、锁定等。
- 线程也会消耗更多内存。
NSOperationQueue:
- NSOperation 类是一个抽象类,它封装了与单个任务相关的代码和数据。
- 开发人员需要使用 NSOperation 的子类或系统定义的子类之一来执行任务。
- 将操作添加到 NSOperationQueue 以执行它们。
- NSOperationQueue 为每个操作创建一个新线程并按照添加顺序运行它们。
- 操作队列处理所有线程管理,确保尽可能快速高效地执行操作。
- 操作队列通过在辅助线程上直接运行操作或使用 GCD(Grand Central Dispatch)间接执行操作。
- 它负责所有内存管理并大大简化了流程。
- 如果你不想使用操作队列,你也可以通过调用它的start方法来执行一个操作。这可能会使您的代码过于复杂。
如何使用 NSThread 和 NSOperationQueue:
NSThread:
- 虽然操作队列是并发执行任务的首选方式,但根据应用程序的不同,有时您仍可能需要创建自定义线程。
- 线程仍然是实现必须实时运行的代码的好方法。
- 将线程用于无法以任何其他方式实现的特定任务。
- 如果您需要从后台运行的代码中获得更可预测的行为,线程可能仍会提供更好的选择。
NSOperationQueue:
- 当您想要同时运行更复杂的操作时,请使用 NSOperationQueue。
- NSOperation 允许子类化、依赖关系、优先级、取消,并且支持许多其他更高级别的功能。
- NSOperation 实际上在底层使用 GCD,因此它与 GCD 一样具有多核、多线程能力。
现在您应该了解 NSTread 和 NSOperation 的优缺点了。您可以根据应用程序的需要使用它们中的任何一个。
【解决方案2】:
在您阅读我的答案之前,您可能需要考虑阅读此内容 - Migrating away from Threads
我将讨论保持在理论上,因为您的问题没有任何代码示例。这两种结构都是提高应用响应能力和可用性所必需的。
消息队列是一种数据结构,用于保存从发送消息到接收者检索并对其采取行动的消息。通常,队列被用作“连接”生产者(数据)和消费者(数据)的一种方式。
线程池是执行某种处理的线程池。线程池通常会附加某种线程安全队列(参考消息队列),以允许您将要完成的作业排队。这里的队列通常被称为“任务队列”。
因此,线程池可以存在于您的生产者端(生成数据)或消费者端(处理数据)。而“传递”这些数据的方法是通过队列。为什么需要这个“中间人”——
- 它将系统解耦。生产者不了解消费者,反之亦然。
- 如果生产者数据出现峰值,消费者不会受到数据的轰炸。队列长度会增加,但消费者是安全的。
示例:
在 iOS 中,主线程,也称为 UI 线程,非常重要,因为它负责将事件分派给适当的小部件,这包括绘图事件,基本上是用户看到和交互的 UI。
如果您触摸屏幕上的按钮,UI 线程会将触摸事件分派给应用程序,然后应用程序设置其按下状态并向事件 queue 发送请求。 UI 线程将请求出列并通知小部件重绘自身。