【发布时间】:2013-05-08 12:02:37
【问题描述】:
我是一名普通的 C# 开发人员,但偶尔会使用 Java 开发应用程序。我想知道是否有任何 Java 等效于 C# async/await? 简而言之,什么是 java 等价物:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
var urlContents = await client.GetStringAsync("http://msdn.microsoft.com");
return urlContents.Length;
}
【问题讨论】:
-
为什么这样会很好:Callbacks as our Generations’ Go To Statement by Miguel de Icaza。
-
Java目前的解决方案是不处理前缀为
async的实际值,而是使用Future或Observable值。 -
没有等价物。而且很痛。还有一项缺少的功能,您需要复杂的解决方法和库来实现,而无法达到与这两个简单单词相同的效果。
-
@pieroxy no async 不是多线程,python 早在 async 之前就有了多线程。多线程使用操作系统线程和它们之间的操作系统时间片。异步使用单个操作系统线程,当任务到达必须停止的逻辑点(例如网络读取)时,应用程序负责切换任务。异步的全部意义在于它在任务阻塞时重用同一个线程来执行其他任务。缺少线程纯粹是 JavaScript 的问题。
-
@pieroxy 仍然没有。即使在 c# 中,核心概念也保持不变,并且不是语法糖 (as described by jon skeet)。当然,多个线程可以从同一个池中执行任务,但这并不意味着异步是一种线程模型。异步很难理解,很多人不理解。在所有支持异步的语言中;
await可以挂起任务的整个调用栈,在同一个线程上执行不同的东西。在 java 中,你只是不能暂停堆栈并在以后恢复它。