主线程上的异步任务和同步任务一样吗?

anb*_*anb 1 grand-central-dispatch ios swift

我知道这两种之间的区别。

对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用线程,任务将被分派到多个线程。
对于同步任务,下一个任务将在当前任务完成后运行。

主线程如何运行异步任务,因为它只有一个线程?

这让我很困惑。
提前致谢。

Pau*_*w11 5

您对异步和同步的定义不太正确。

在 Grand Central Dispatch 中,您考虑的是队列,而不是线程。队列要么是串行调度队列,要么是并发调度队列。

串行调度队列可以一次运行一个任务,任务一个接一个(串行)调度。

并发调度队列可以在多个线程上同时运行多个任务。

任务在线程上执行,Grand Central Dispatch 负责为您将任务分配给线程。

主队列是一个特殊的串行调度队列,只将任务分配给主线程。其他队列可以将任务分配给任何可用线程,包括主线程。

现在,对于同步和异步分派,区别在于分派是阻塞当前线程直到分派任务完成(同步)还是将任务排队而不阻塞当前线程(异步)。

当您异步调度到主队列时,您提供了一个工作单元,Grand Central Dispatch 将在未来某个时刻分配给主线程,但您的代码会继续执行,而无需等待该调度项目完成。

在主队列上运行时,您可以很愉快地将异步任务分派到主队列,因为当主队列准备好任务时,分派的任务将在稍后执行。

您不能做的是主队列同步分派到主队列(或者更一般地说,从同一队列同步分派到任何串行分派队列),因为您会造成死锁。

调度同步阻塞当前线程/队列,直到调度的项目完成。在串行调度队列上,调度项目无法执行,因为调度队列被阻塞。