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<Boolean> and Inventory.giveItem返回CompletableFuture<String>
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 >
