ios - 主线程上的异步任务与同步任务相同吗?
问题描述
我知道这两种的区别。
对于异步任务,下一个任务将在当前任务开始后运行,这意味着如果有可用的线程,任务将被分派到多个线程。
对于同步任务,下一个任务将在当前任务完成后运行。
主线程只有一个线程,如何运行异步任务?
这让我很困惑。
提前致谢。
解决方案
您对异步和同步的定义不太正确。
在 Grand Central Dispatch 中,您考虑的是队列,而不是线程。队列要么是串行调度队列,要么是并发调度队列。
串行调度队列一次可以运行一个任务,并且任务一个接一个地调度(串行)。
并发调度队列可以在多个线程上同时运行多个任务。
任务在线程上执行,Grand Central Dispatch 负责为您分配任务给线程。
主队列是一个特殊的串行调度队列,它只将任务分配给主线程。其他队列可以将任务分配给任何可用线程,包括主线程。
现在,对于同步与异步分派,区别在于分派是阻塞当前线程直到分派任务完成(同步)还是将任务排队而不阻塞当前线程(异步)。
当您异步分派到主队列时,您提供的是 Grand Central Dispatch 将在未来某个时间分配给主线程的工作单元,但您的代码会继续执行而不等待分派的项目完成。
您可以在主队列上运行时非常高兴地将异步任务分派到主队列,因为分派的任务将在主队列准备好执行任务时稍后执行。
你不能做的是从主队列同步调度到主队列(或者更一般地说,从同一个队列同步调度到任何串行调度队列),因为你会创建一个死锁。
分派同步阻塞当前线程/队列,直到分派项目完成。在串行调度队列上,调度项目无法执行,因为调度队列被阻塞。
推荐阅读
- azure - 如何允许匿名和经过身份验证的访问 Azure Web App
- android - 如何在 Flutter 应用程序中断开与多个连接的 ble 设备的连接?
- mysql - 获取按组分隔的列的平均值
- javascript - 我无法使用承诺按时间延迟升序获取数字来控制台登录
- vue.js - 如何删除html标签
- python - 如果缺失值高于阈值,则使程序停止
- sqlite - 查询数据库,SQlite,无法打开数据库
- svn - 如何恢复到 svn 中对本地 repo 所做的更改?
- javascript - Angular + HTML - 如何打开下载文件资源管理器窗口而不是自动下载?
- javascript - TypeScript - 你如何链接访问可选的嵌套类型属性?