首页 > 解决方案 > 在 Java 中处理异步操作

问题描述

下面代码的问题是,如果我删除,Thread.sleep(1000);那么我会得到不一致的结果。我不想使用Thread.Sleep(1000); 因为我正在使用 vertx 的异步操作,所以我想等到我的 rowSet 被数据填满。

请帮助提前谢谢...!

import io.vertx.pgclient.RgPool;
import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.RowSet;

class TestAsyncOperation{
private RowSet<Row> rowSet;

public RowSet<Row> getResult(){

   PgPool conn = DbConfig.getConnection();// consider db connections is received

   String qry = "select col1 as column1, col2 as column2 from SomeTable";
   
   conn.query(qry).execute(asyncResult -> {
       if(asyncResult.succeeded()){
         rowSet = asyncResult.result();
       }else{
           throw new Exception(asyncResult.cause().getMessage());
       }
    Thread.sleep(1000);
    if(Optional.ofNullable(rowSet).isPresent){
       return rowSet;
     }else{
       return null;
     }

});

}

}

标签: javaasynchronousconcurrencyvert.x

解决方案


您可以使用 Java Future 功能仅在完成后处理结果,但如果您使用的 vertx 方法executeBlocking可以在 eventLoop 内运行但它需要是一个低秒任务,您可以使用一个仅使用整个线程的 worker verticle对于一个verticle,IMO你应该考虑一种反应方法,使用java 9中的反应库RxJava你可以订阅你的数据库更改并完成你的工作,vert.x提供了一个Rxjava插件顺便说一句。


推荐阅读