我是一名普通的C#开发人员,但偶尔会用Java开发应用程序。我想知道是否有与C#async/await相当的Java?简单地说,java等价物是什么:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
var urlContents = await client.GetStringAsync("http://msdn.microsoft.com");
return urlContents.Length;
}
请查看ea async,它执行Java字节码重写以非常好地模拟async/await。根据他们的自述:“它深受.NETCLR上异步等待的启发”
当异步操作完成(客户端)时,
)。wait
使用一个延续来执行其他代码。GetStringAsync(...)
因此,作为最接近的近似值,我将使用CompletableFuture
2016年5月25日更新至2016年12月13日发布的AsyncHttpClient v.2:
因此,Java8等效于AccessTheWebAsync()
的OP示例如下:
CompletableFuture<Integer> AccessTheWebAsync()
{
AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
return asyncHttpClient
.prepareGet("http://msdn.microsoft.com")
.execute()
.toCompletableFuture()
.thenApply(Response::getResponseBody)
.thenApply(String::length);
}
这个用法来源于如何从异步Http客户端请求中获得完整的未来?根据2016年12月13日发布的AsyncHttpClient第2版中提供的新API,该API已经对CompletableFuture提供了内在支持
使用AsyncHttpClient版本1的原始答案:
为此,我们有两种可能的方法:
>
第一个使用非阻塞IO,我称之为
访问WebAsyncino
。然而,由于AsyncCompletionHandler
是一个抽象类(而不是函数接口),我们不能将lambda作为参数传递。因此,由于匿名类的语法,它不可避免地会引起冗长。但是,此解决方案最接近给定C#示例的执行流。
第二个稍微不那么详细,但是它将提交一个新任务,最终将阻止
f.get()
上的线程,直到响应完成。
第一种方法,更详细但无阻塞:
static CompletableFuture<Integer> AccessTheWebAsyncNio(){
final AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
final CompletableFuture<Integer> promise = new CompletableFuture<>();
asyncHttpClient
.prepareGet("https://msdn.microsoft.com")
.execute(new AsyncCompletionHandler<Response>(){
@Override
public Response onCompleted(Response resp) throws Exception {
promise.complete(resp.getResponseBody().length());
return resp;
}
});
return promise;
}
第二种方法不太冗长,但会阻塞线程:
static CompletableFuture<Integer> AccessTheWebAsync(){
try(AsyncHttpClient asyncHttpClient = new AsyncHttpClient()){
Future<Response> f = asyncHttpClient
.prepareGet("https://msdn.microsoft.com")
.execute();
return CompletableFuture.supplyAsync(
() -> return f.join().getResponseBody().length());
}
}
不,在Java中,甚至在v5之前的C中,都没有任何与async/await等价的东西。
在幕后构建状态机是一个相当复杂的语言特性。
Java中对异步/并发性的语言支持相对较少,但是Java。util。concurrent
包包含了许多有用的类。(与任务并行库不完全相同,但最接近。)
问题内容: 我是来自C / STL的相对较新的Java程序员,并且正在寻找具有以下特征的类(据我所了解,C std :: deque具有): O(1)在开头/结尾插入/移除的性能 按索引查找的O(1)性能 是可增长的集合(不需要固定的大小范围) 是否有与此等效的Java?我发现Java 1.6 [ArrayDeque]类具有插入/移除和可增长的特性,但是似乎没有按索引查找的方法,除非调用toArr
问题内容: 在C#中,您可以匿名定义委托(即使它们不过是语法糖)。例如,我可以这样做: 是否可以在Java中传递这样的代码?我正在使用处理框架,该框架具有Java的较旧版本(它没有泛型)。 问题答案: Java 8之前的版本: 最接近委托的Java是单方法接口。您可以使用匿名内部类。 Java 8及更高版本: Java 8 在该语言中添加了lambda表达式。
我想知道在java中是否有与此等效的: 当然,假设。。。有一个名为Person的类,其FirstName字段和LastName字段为{get;set;}
问题内容: 在Java中最接近std :: vector的东西是什么?我的意思是,一个可以将T放入其构造函数中,然后将pushBack和popBack()接收到的类,该类存储在连续内存中(而不是链表)。 谢谢 问题答案: ArrayList 一切都内部存储在数组(“连续内存”)中,尽管操作名称略有不同。 有关Java中的列表实现 和泛型的更多信息 编辑 Helper Method 在他的回答中也提
问题内容: 我正在努力寻找一种方法,以根据谓词在流的开头跳过某些元素。 像这样: 那相当于Scala 。 问题答案: 这种操作不是s 的预期用例,因为它并入了元素之间的依赖关系。因此,该解决方案可能看起来不太好,因为您必须为谓词引入一个全状态变量: 请注意,与您的示例相比,该条件必须颠倒。 当然,您可以在方法中隐藏令人讨厌的细节: 一个更复杂,但更清洁,可能更有效的方法是深入研究金属,即界面: 可
问题内容: Java的运算符等效于什么(在C#中)? (为澄清起见,我不是指and 运算符。) 问题答案: 在C#中,可以使用无符号整数类型,然后使用和执行您期望的操作。有关移位运算符的MSDN文档为您提供了详细信息。 由于Java不支持无符号整数(除之外),因此需要此附加运算符。