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唯一要求是必须仅在返回CompletableFuture , CompletionStage或CompletableFuture子类的方法中使用。
使用小牛
< dependency >
< groupId >com.ea.async groupId >
< artifactId >ea-async artifactId >
< version >1.2.3 version >
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.await和Async.init 。
选项4-构建时间仪器,使用Maven-首选
使用EA-ASYNC-MAVEN-PLUGIN。它将在编译时间内启动您的课程,并删除所有引用Async.await和Async.init() 。
使用构建时间仪器,您的项目用户不需要将ea async在其类路径中使用,除非他们也选择使用它。这意味着ea async不需要是一种传递性依赖性。
这是图书馆和Maven项目的最佳选择。
< build >
< plugins >
< plugin >
< groupId >com.ea.async groupId >
< artifactId >ea-async-maven-plugin artifactId >
< version >1.2.3 version >
< executions >
< execution >
< goals >
< goal >instrument goal >
< goal >instrument-test goal >
goals >
execution >
executions >
plugin >
plugins >
build >通过命令行克隆项目: