我对Java线程有疑问。当我仅使用主线程时,可以异步运行两个任务吗?我读了这篇文章:异步与同步执行,这实际上意味着什么? 第二个答案是可能的情况,其中只有一个线程(而不是主线程和另一个线程)并且任务被异步执行。我认为这在Java中是不可能的,因为仅存在一个控制流。我认为在Java中,每个任务都需要自己的线程来异步执行任务。
简短的回答:是的。这实际上是非阻塞I / O的共同特征。Java有一个非阻塞I / O库-您可以在此处查看有关它的更多详细信息。(不过,我确实不知道该库的所有实现细节,因此我不确定是否可以保证不会创建额外的线程)。例如,这是Node.js的显着功能,.NET Framework也提供了此功能。
这里有一个类比来说明单线程异步编程和多线程之间的区别:假设您去一个有10个人的餐厅。当服务员要求第一个人点菜时,他还没有准备好。在带有阻塞I / O的“普通”单线程编程中,服务员会等到他准备好后再转到其他任何人。在多线程中,您可以引入第二个服务员来等待他。在异步/非阻塞I / O中,您只需移至组中的下一个人,然后在第一个人准备好之后再返回。
显然,我在这里掩盖了许多微妙之处,但希望可以在一定程度上说明这种差异。
有关更多信息,请参见:
没有线程(专注于C#)