gpt4 book ai didi

java - 暂停方法的执行,直到回调完成

转载 作者:行者123 更新时间:2023-12-01 13:16:11 25 4
gpt4 key购买 nike

我对 Java 相当陌生,对并发性也非常陌生。不过,我已经使用 C# 工作了一段时间了。这并不重要,但为了举例,我试图从服务器上的表中提取数据。我想要方法等待数据完全拉出。在 C# 中,我们有异步等待模式,可以像这样使用:

private async Task<List<ToDoItem>> PullItems ()
{
var newRemoteItems = await (from p in remoteTable select p).ToListAsync();
return newRemoteItems;
}

我正在尝试在Java中实现类似的效果。 Here是我尝试移植的确切代码(查看 SynchronizeAsync 方法内部。)!但是,Java Azure SDK 使用回调。所以,我有几个选择:

使用waitnotify模式。以下代码不起作用,因为我不明白我在做什么。

final List<TEntity> newRemoteItems = new ArrayList<TEntity>();
synchronized( this ) {
remoteTable.where().field("lastSynchronized").gt(currentTimeStamp)
.execute(new TableQueryCallback<TEntity>() {
public void onCompleted(List<TEntity> result,
int count,
Exception exception,
ServiceFilterResponse response) {
if (exception == null) {
newRemoteItems.clear();
for (TEntity item: result) {
newRemoteItems.add(item);
}
}
}
});
}
this.wait();
//DO SOME OTHER STUFF

我的另一个选择是将 DO SOME OTHER STUFF 移到回调的 if(exception == null) block 内。然而,这会导致我的整个方法逻辑被切成 fragment ,扰乱连续的流程。我不太喜欢这种方法。

现在,有问题:

  1. 推荐的方法是什么?我正在完成 Oracle 的 Java 并发教程。还是一无所知。几乎在我读到的所有地方,都建议使用更高级别的东西,而不是 waitnotify

  2. 我的waitnotify出了什么问题?

  3. 我的实现会阻塞主线程,这被认为是一种不好的做法。但我还能做什么呢?我必须等待服务器响应!另外,C# await 不会阻塞主线程吗?这怎么不是一件坏事呢?

最佳答案

要么将DO SOME OTHER STUFF放入回调中,要么声明semaphore ,然后在回调中调用 semaphore.release 并在您想要等待的地方调用 semaphore.aquire 。删除synchronized(this)和this.wait。

关于java - 暂停方法的执行,直到回调完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com