最近看到一个文章里面有这么一段话:每个应用都只有一个主线程,但主线程中可能有多个队列,则不仅仅只有主队列。突然发现自己对于线程跟队列这两个概念有些分辨不清,所以在这里重新梳理一下。

基本概念

  • 队列:可以理解为一个FIFO的列表,里面装着需要执行的任务。
    gcd会从队列中取任务,然后放到对应的线程中去执行。

  • 串行队列与并行队列

    大家都知道gcd中队列分两种:

    • 串行(主队列 DispatchQueue.main, 默认新建 DispatchQueue(label: “XXX”))
    • 并行(全局队列 DispatchQueue.global(),DispatchQueue(label: “XXX”, qos: .default, attributes: .concurrent))
  • 同步与异步
    同步与异步经常容易跟串行与并行相互混淆。同步异步指的是任务的执行方式;而串行与并行是队列本身的属性。(具体同步异步与串行并行之间的区分在我上一篇讲NSOperation的帖子中有,这里就不再赘述了)

所以这么看队列是存储任务的容器,线程当然是真正执行任务的地方。
那队列中的任务到底会被分配到什么线程去执行任务呢?

  • 首先,如果任务是同步执行(sync),则不会开启任何新的线程,跟队列属性(同步异步)无关,任务只会在当前线程执行
  • 如果是异步执行,则会可能会开启新线程(主要还是通过gcd来控制,gcd会维护一个线程池);但主队列特殊一些,主队列异步执行仍然是在主线程中执行任务,只是不会阻塞当前线程。

所以,队列跟任务所执行的线程并无特定关系。除主线程跟主队列特殊一些。

在objc上看到了这样的一张图,我觉得可能对这个问题的理解更加直观,所以附在这里

我看到的那句话可能是指在主线程中可以create好多个队列来执行任务的意思吧。