首页 > 解决方案 > 主线程上的异步任务与同步任务相同吗?

问题描述

我知道这两种的区别。

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

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

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

标签: iosswiftgrand-central-dispatch

解决方案


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

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

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

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

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

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

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

当您异步分派到主队列时,您提供的是 Grand Central Dispatch 将在未来某个时间分配给主线程的工作单元,但您的代码会继续执行而不等待分派的项目完成。

您可以在主队列上运行时非常高兴地将异步任务分派到主队列,因为分派的任务将在主队列准备好执行任务时稍后执行。

你不能做的是从主队列同步调度到主队列(或者更一般地说,从同一个队列同步调度到任何串行调度队列),因为你会创建一个死锁。

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


推荐阅读