我对Java线程有疑问。当我只使用主线程时,是否可以异步运行两个任务?我读过这篇文章:Asynchronous vs synchronous execution, what does it really mean? 第二个答案说,可能的情况是只有一个线程(不是主线程和另一个线程),并且任务是异步执行的。我认为在Java中是不可能的,因为只存在一个控制流。 我认为在Java中,每个任务都需要异步执行任务的线程。
答案 0 :(得分:6)
简短回答:是的。这实际上是非阻塞I / O的常见功能。 Java有一个非阻塞的I / O库 - 您可以看到有关它的更多详细信息here。 (我实际上并不知道库的所有实现细节,所以我不确定是否保证它不会创建额外的线程)。例如,这是Node.js的一个显着特性,.NET Framework也提供此功能。
这里有一个类比来说明单线程异步编程和多线程之间的区别:假设你去了一个有10人团队的餐馆。当服务员要求第一个人订购时,他还没准备好。在具有阻塞I / O的“普通”单线程编程中,服务员等到他准备好之后才转移到其他任何人。在多线程中,你可以带第二个服务员等他。在异步/非阻塞I / O中,您只需转移到组中的下一个人,并在他准备好时回到第一个人。
显然,我正在掩饰这里的许多细微之处,但希望这在某种程度上说明了差异。
有关详细信息,请参阅:
Does an asynchronous call always create/call a new thread?
Asynchronous processing with a single thread
There is no thread(专注于C#)