当前位置: 首页 > 知识库问答 >
问题:

Java等价于C#async/await?

松高歌
2023-03-14

我是一名普通的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;
}

共有3个答案

戚默
2023-03-14

请查看ea async,它执行Java字节码重写以非常好地模拟async/await。根据他们的自述:“它深受.NETCLR上异步等待的启发”

殷承恩
2023-03-14

当异步操作完成(客户端)时,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());
        }
    }
    

  • 李联
    2023-03-14

    不,在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不支持无符号整数(除之外),因此需要此附加运算符。