处理Java中的异步操作

时间:2020-09-01 21:43:05

标签: java asynchronous concurrency vert.x

以下代码存在问题,如果我删除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;
     }

});

}

}

2 个答案:

答案 0 :(得分:0)

您只能使用Java Future功能来处理结果,但是,如果您使用的是可以在eventLoop中运行的vertx方法executeBlocking,但是它需要很短的时间,您可以使用仅将一个线程使用整个线程的工作线程IMO,您应该考虑使用反应性方法,使用Java 9中的反应性库RxJava,您可以订阅dabatase更改并进行工作,vert.x提供了一个Rxjava插件btw。 / p>

答案 1 :(得分:0)

对于并行活动(线程和异步过程)之间的通信,简单变量不适合。 相反,应使用数据流变量,例如期货:

    PgPool conn = DbConfig.getConnection();// consider db connections is received
    String qry = "select col1 as column1, col2 as column2 from SomeTable";
    CompletableFuture<RowSet<Row>> rowSet = new CompletableFuture<RowSet<Row>>();
    conn.query(qry).execute(asyncResult -> {
        if(asyncResult.succeeded()){
            rowSet.complete(asyncResult.result());
        }else{
            rowSet.completeExceptionally(asyncResult.cause());
        }
    });
    try {
        return rowSet.get();
    } catch (Exception e) {
        return null;
    }