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

时间:2018-05-29 04:38:34

标签: ios multithreading threadpool grand-central-dispatch qos

上下文

根据我的理解,主DispatchQueue仅在Main Thread上调度任务,主要用于UI。

然而,非主Main Thread也可以使用DispatchQueue

Apple有QOS优先处理任务:

  

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

     

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

     

实用程序:工作可能需要一点时间,不需要立即完成。类似于进度条和导入数据。

     

背景:用户无法看到此作品。备份,同步,索引等

我的问题是:

0,如标题所述,线程只包含2种类型,即Main ThreadBackground Thread

1,Background Thread是否表示执行的所有任务都不会阻止用户界面?

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

3,从链接How to create dispatch queue in Swift 3开始。 它提到了几种不同的方式来创建一个Dispatch Queue,一些是并发的,一些是串行的。它还提到通过为Background Threaddefault分配QOS,可以保证background访问Queue。但是background threadsSerial中没有提到这一点。我想知道那些是正确的吗?

1 个答案:

答案 0 :(得分:1)

您问:

  

线程仅包含两种类型,即主线程和后台线程吗?

我不确定是否将它们描述为不同的“类型”,但是从应用程序开发人员的角度来看,是的,有专用于UI的“主”线程,主运行循环等,还有其他所有线程,相比之下,顾名思义,它们是“后台”线程。

我们总是要谨慎对待运行主队列的内容(即,不要在其上运行任何可能阻塞该线程并有效地阻塞UI的操作)。实际上,我们希望避免在主队列上执行任何可能最多阻止其超过几毫秒的操作。

  

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

有效,是的。但是我们只能处理设备上的有限资源,因此开发人员必须明智。例如,对于我们的后台任务,我们想使用与该队列正在执行的操作相当的QoS。或者,如果并行执行某些任务,则在限制并发程度时应格外小心。但是,如果对系统资源的使用持谨慎态度,并且将阻止任务保留在主队列之外,那么可以确保响应式UI。

最重要的是,如果您有一些代码会阻塞运行该线程的线程(例如,计算量大,它会阻塞信号量或调度组wait等调用,则通常)在后台线程上运行该命令以避免阻塞主队列。

  

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

这些只是“服务质量”级别,仅是队列的相对优先级。这不是“阻止用户界面”或“不”用户界面的问题,而是GCD如何确定资源优先级和分配资源的问题。

  

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

  

...它还提到通过为QOS分配默认值或后台,可以保证Queue访问后台线程...

这不太有意义。也许您可以分享文档中的特定摘录,我们可以帮助您解释他们想要说的话。

  

...但是在“序列和并发”中没有提到过这样的事情。我想知道这些正确吗?

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