这个问题太笼统,几乎无法回答。

在一般情况下,异步调用不一定创建新线程。这是实现它的一种方法,其他方法是使用预先存在的线程池或外部进程。它严重依赖于语言、对象模型(如果有的话)和运行时环境。

异步只是意味着调用线程不会坐等响应,也不会在调用线程中发生异步活动。

除此之外,你得说得更具体些。

Windows 总是使用消息循环进行非抢占式处理(版本2.13、3.0、3.1等) ,远远早于支持真正的线程。因此,要回答您的问题,没有必要创建一个线程来执行异步处理。

异步只是意味着你不会阻塞你的程序等待某些事情(函数调用,设备等)完成。它可以在一个单独的线程中实现,但是也常常使用一个专用线程来执行同步任务,并通过某种事件系统进行通信,从而实现类似于异步的行为。

有一些单线程异步程序的例子,比如:

...do something
...send some async request
while (not done)
...do something else
...do async check for results

有些系统允许您利用内核中的并发性,使用回调实现某些功能。对于一个相当模糊的实例,异步 IO 回调被用来实现非阻塞的互联网服务器,在 Mac System 6-8的非抢占式多任务时代。

这样,您的程序中就有了并发执行流,而不需要线程 就这样

异步调用的本质是,如果希望应用程序在调用过程中继续运行,则需要为 产卵创建一个新线程,或者至少为 使用创建另一个仅用于处理异步回调的线程。

有时,根据具体情况,您可能希望调用一个异步方法,但是让用户觉得它是同步的(即阻塞,直到异步方法发出完成的信号)。这可以通过诸如 WaitForSingleObject之类的 Win32 API 来实现。

异步调用甚至不需要发生在调用该调用的系统/设备上。因此,如果问题是,异步调用是否需要当前进程中的线程,答案是否定的。但是,必须有一个处理异步请求的执行线程。

执行程序是一个模糊的术语。在早期的 Macintosh 和 Windows 操作系统这样的协同任务系统中,执行线程可能仅仅是使请求运行另一个堆栈、指令指针等等的相同进程。.然而,当人们通常谈论异步调用时,他们通常指的是由另一个线程处理的调用,如果它是进程内(即在同一个进程内) ,或者由另一个进程处理的调用,如果它是进程间的调用。

请注意,进程间(或进程间)通信(IPC)通常被推广为包括进程内通信,因为锁定和同步数据的技术通常是相同的,不管执行的单独线程运行在哪个进程中。

每当需要异步执行的操作不需要 CPU 执行工作时,可以在不产生另一个线程的情况下执行该操作。例如,如果异步操作是 I/O,则 CPU 不必等待 I/O 完成。它只需要启动操作,然后可以转移到其他工作,而 I/O 硬件(磁盘控制器、网络接口等)进行 I/O 工作。硬件通过中断 CPU 来让 CPU 知道它什么时候结束,然后操作系统将事件传递给应用程序。

通常较高级别的抽象和 API 不会公开底层异步 API 在操作系统和底层硬件中的可用性。在这种情况下,通常更容易创建线程来执行异步操作,即使产生的线程只是在等待 I/O 操作。

如果异步操作需要 CPU 进行工作,那么通常这个操作必须在另一个线程中进行,这样才能真正实现异步操作。即便如此,只有在有多个执行单元的情况下,它才是异步的。

JavaScript 是单线程和异步的。例如,当您使用 XmlHttpRequest 时,您为它提供了一个回调函数,该函数将在响应返回时异步执行。

John Resig 对 计时器在 JavaScript 中工作的相关问题有很好的解释。

不,异步调用并不总是涉及线程。

它们通常会启动某种与调用者并行进行的操作。但是这个操作可能由另一个进程处理,操作系统、其他硬件(如磁盘控制器)、网络上的其他计算机或人来处理。线程不是并行完成任务的唯一方法。

多线程是指在同一进程中发生多个操作。而异步编程则跨进程传播。例如,如果我的操作调用一个 Web 服务,线程不需要等到 Web 服务返回。这里我们使用异步编程,允许线程不等待另一台机器中的进程完成。当它开始从 webservice 获得响应时,它可以中断主线程,表示 Web 服务已经完成了对请求的处理。现在主线程可以处理结果了。