代码之家  ›  专栏  ›  技术社区  ›  Tony Lin

GCD:线程只有两种类型吗?主线程和后台线程

  •  1
  • Tony Lin  · 技术社区  · 7 年前

    上下文:

    据我所知,主要 DispatchQueue 仅调度上的任务 Main Thread 主要用于用户界面。

    然而, 主螺纹 也可用于非主 调度队列 S.

    苹果有 QOS 要优先处理任务:

    用户交互 :在主线程上发生的工作,如动画或绘图操作。

    用户已启动 :用户启动并立即产生结果的工作。必须完成此工作,用户才能继续。

    公用事业 :可能需要一点时间而不需要马上完成的工作。类似于进度条和导入数据。

    背景 :此工作对用户不可见。备份、同步、索引等。

    我的问题是:

    0,如标题所述,线程只包含两种类型,即 主螺纹 Background Thread ?

    1,是的 后台线程 意味着所有执行的任务都不会阻塞UI?

    2,因为它提到 User Interactive 任务将在主线程上执行以避免UI滞后的优先级,是否意味着所有其他类型: User Initiated , Utility , Background 一定会有 后台线程 这不会阻止用户界面?

    3,从连接处, How to create dispatch queue in Swift 3 . 它提到了创建调度队列的几种不同方法,一些是并发的,一些是串行的。它还提到通过分配QoS default background ,它保证 Queue 访问 background threads . 但在 Serial Concurrent . 我想知道这些是正确的吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rob Md Fahim Faez Abir    6 年前

    你会问:

    线程是否只包含两种类型,即主线程和后台线程?

    i_m不确定i_d是否将它们描述为不同的__类型_,但从应用程序开发人员的角度来看,是的,有专门用于UI、主运行循环等的__main__线程,并且有所有其他线程,与此相反,根据定义,它们是_背景_157;线程。

    我们总是要小心运行主队列的内容(即不要在主队列上运行任何可能阻塞该线程并有效阻塞UI的内容)。在实践中,我们希望避免在主队列上做任何可能阻塞它超过几毫秒的事情,最多。

    后台线程是否意味着所有执行的任务都不会阻塞UI?

    实际上,是的。但我们的设备资源有限,因此开发人员必须明智。例如,对于我们的后台任务,我们希望使用与队列所做的工作相称的QoS。或者,如果将某个任务并行化,那么应该注意限制并发性的程度。但是,如果一个人明智地使用系统资源,并且不断地将任务阻塞在主队列之外,那么这就可以确保一个响应迅速的用户界面。

    底线是的,如果您有一些代码会阻塞运行它的线程(例如,它的计算代价很高,它会阻塞诸如信号量或调度组之类的调用) wait 等等),您通常会在后台线程上运行它,以避免阻塞主队列。

    因为它提到用户交互是任务将在主线程上执行的优先级,以避免UI滞后,它是否意味着所有其他类型:用户启动、实用程序、后台将确保具有不阻塞UI的后台线程?

    这些只是服务质量级别,它们只是队列的相对优先级。问题不在于是否阻塞用户界面,而在于GCD如何对资源进行优先级排序和分配。

    从链接中,如何在swift 3中创建调度队列。它提到了创建调度队列的几种不同方法,一些是并发的,一些是串行的…

    是的

    …它还提到,通过使用缺省或后台分配QoS,可以保证队列访问后台线程…

    这不太合理。也许你可以分享这些文件的具体摘录,我们可以帮助你解释他们想说什么。

    …但是在串行和并发中没有提到类似的内容。我想知道这些是正确的吗?

    QoS只是给定队列的优先级和资源问题。串行与并发只是一个问题,一个队列是否一次只限于一个线程,或者在需要和可用时,它是否能够利用多个线程。