ea async

JAVA源码 2025-08-20

ea async

ea async在JVM中实现异步 - wait方法。它允许程序员以顺序的方式编写异步代码。

它受到.NET CLR上异步 - AWAIT的启发,请参见异步编程,并带有异步,并等待更多信息。

谁应该使用它?

ea async应用于编写非阻滞异步代码,以大量使用完整的图或完成阶段。当您的代码等待其他流程时,它通过释放工作人员线程来提高可扩展性;并通过使异步代码变得更简单,更可读性来提高生产率。

开发人员和许可证

该项目是由电子艺术开发的,并获得了BSD 3范围许可证的许可。

例子

与ea async

 import static com . ea . async . Async . await ;
import static java . util . concurrent . CompletableFuture . completedFuture ;

public class Store
{
    public CompletableFuture < Boolean > buyItem ( String itemTypeId , int cost )
    {
        if (! await ( bank . decrement ( cost ))) {
            return completedFuture ( false );
        }
        await ( inventory . giveItem ( itemTypeId ));
        return completedFuture ( true );
    }
}

在此示例中, Bank.decrement返回CompletableFuture and Inventory.giveItem返回CompletableFuture

ea async重写了Async.await的调用,使您的方法无障碍。

这些方法看起来是阻止的,但实际上被转变为异步方法,这些方法使用完整的未图像在中间结果到达时继续执行。

没有ea async

这就是第一个示例没有ea async样子。这有点不那么可读。

 import static java . util . concurrent . CompletableFuture . completedFuture ;

public class Store
{
    public CompletableFuture < Boolean > buyItem ( String itemTypeId , int cost )
    {
        return bank . decrement ( cost )
            . thenCompose ( result -> {
                if (! result ) {
                    return completedFuture ( false );
                }
                return inventory . giveItem ( itemTypeId ). thenApply ( res -> true );
            });
    }
}

这是一个很小的例子...一种具有更多完整图的方法看起来非常令人费解。

ea async抽象了完整的未来的复杂性。

与ea async (2)

所以您喜欢完整的futures吗?尝试将此方法转换为仅使用可完整的未经图片而不会阻止(因此没有加入):

 import static com . ea . async . Async . await ;
import static java . util . concurrent . CompletableFuture . completedFuture ;

public class Store
{
    public CompletableFuture < Boolean > buyItem ( String itemTypeId , int cost )
    {
        if (! await ( bank . decrement ( cost ))) {
            return completedFuture ( false );
        }
        try {
            await ( inventory . giveItem ( itemTypeId ));
            return completedFuture ( true );
        } catch ( Exception ex ) {
            await ( bank . refund ( cost ));
            throw new AppException ( ex );
        }
    }
}

知道了?发送给我们。它看起来很丑...

入门

ea async目前支持JDK 8-10。

它与Java和Scala一起使用,应该与大多数JVM语言一起使用。使用ea async唯一要求是必须仅在返回CompletableFutureCompletionStageCompletableFuture子类的方法中使用。

使用小牛

< dependency >
    < groupId >com.ea.asyncgroupId >
    < artifactId >ea-asyncartifactId >
    < version >1.2.3version >
dependency >

gradle

 'com.ea.async:ea-async:1.2.3'

仪器代码

选项1 -JVM参数

使用额外的JVM参数启动您的应用程序: -javaagent:ea-async-1.2.3.jar

 java -javaagent:ea-async-1.2.3.jar -cp your_claspath YourMainClass args...

建议将其添加为使用EA-ASYNC的Intellij Projects中的启动器中的默认选项。

选项2-运行时

在您的主班上或尽早致电一次:

 Async.init();

只要您的JVM具有启用功能,这将启动运行时仪器代理。如果您忘记调用此功能,则第一个await的电话将初始化系统(并打印一个警告)。

这是用于测试和开发的解决方案,其配置量最少。它可能会干扰JVM调试。这种替代方案是作为后备。

选项3-运行仪器工具

EA-ASYNC-1.2.3.JAR是一个可运行的JAR,可以预先放大您的文件。

用法:

java -cp YOUR_PROJECT_CLASSPATH -jar ea-async-1.2.3.jar classDirectory

例子:

java -cp guava.jar ; commons-lang.jar  -jar ea-async-1.2.3.jar target/classes

之后,目标/类中的所有文件都将得到仪器。这些班级将没有提及Async.awaitAsync.init

选项4-构建时间仪器,使用Maven-首选

使用EA-ASYNC-MAVEN-PLUGIN。它将在编译时间内启动您的课程,并删除所有引用Async.awaitAsync.init()

使用构建时间仪器,您的项目用户不需要将ea async在其类路径中使用,除非他们也选择使用它。这意味着ea async不需要是一种传递性依赖性

这是图书馆和Maven项目的最佳选择。

< build >
    < plugins >
        < plugin >
            < groupId >com.ea.asyncgroupId >
            < artifactId >ea-async-maven-pluginartifactId >
            < version >1.2.3version >
            < executions >
                < execution >
                    < goals >
                        < goal >instrumentgoal >
                        < goal >instrument-testgoal >
                    goals >
                execution >
            executions >
        plugin >
    plugins >
build >
下载源码

通过命令行克隆项目:

git clone https://github.com/electronicarts/ea-async.git