java - 在 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;
}
});
}
}
解决方案
您可以使用 Java Future 功能仅在完成后处理结果,但如果您使用的 vertx 方法executeBlocking
可以在 eventLoop 内运行但它需要是一个低秒任务,您可以使用一个仅使用整个线程的 worker verticle对于一个verticle,IMO你应该考虑一种反应方法,使用java 9中的反应库RxJava你可以订阅你的数据库更改并完成你的工作,vert.x提供了一个Rxjava插件顺便说一句。
推荐阅读
- javascript - 存储过程 SP_AUTOMATE_TYPE2 中的执行错误:SQL 编译错误:Snowflake.execute 中的标识符“F58139”无效
- python - 在计时器上安排蝗虫任务
- python-3.x - 有没有办法可以缩短这些 if 语句?
- excel - 使用循环从多个范围复制粘贴到单行到另一个 WB
- excel - Excel 按列突出显示整行值
- intellij-idea - InelliJ IDEA 为文件中的所有函数创建测试
- reactjs - 如何重构代码以使用打字稿循环对象并做出反应?
- powershell - 用于计数文件和文件夹并发送电子邮件的 Powershell 脚本
- python - 通过键在 PySimpleGui 的 Frame 中查找元素
- python - Python GUI 反复调用函数并按下按钮