怎么使得异步方法执行完成然后在进行下一步。

247 天前
 unregister

比如有个方法 是 public void searchxx 那么里面调用了一个自己框架里的异步方法,没有返回值,另外的方法调用这个 search 方法的时候怎么等到它执行完之后,怎么把它变阻塞,才进行下一步?有没有大佬指点一下,比较简单的,不涉及到框架代码重写的,只能修改 search 方法

1881 次点击
所在节点    Java
22 条回复
lvxiaomao
247 天前
1 、如果要阻塞,那为啥 search 里面是异步执行?
2 、异步使用 future 返回,future 等待结果完成 再做 search 的 return 呗
wctml
247 天前
协程
unregister
247 天前
@lvxiaomao 好的,谢谢大佬,我决定自己在网上找一下资料,在试试
@wctml
unregister
247 天前
@wctml 我们是 java 8 的
mango88
247 天前
你框架里异步方法可以改吗
minho
247 天前
用 CountDownLatch 试试
leonshaw
247 天前
异步方法完成是怎么通知的
gosidealone
247 天前
CompletableFuture
leeton
247 天前
我懂了你的意思,你调用了一个框架方法,它是异步的且没有返回值。你又不能修改框架方法,那就看看这个方法的参数能不能搞一个子类,弄一个 CountDownLatch 上去。
leeton
247 天前
@leeton #9 尴尬了,框架方法里没法 countDown😅
imokkkk
247 天前
CompletableFuture 感觉很好用 现在代码里异步基本都用它处理了 可以看下这篇文章
https://mp.weixin.qq.com/s/GQGidprakfticYnbVYVYGQ
kaneg
247 天前
search 没有结果你怎么使用?还是把代码脱敏后贴上来大家才能帮你想办法,不然都是猜
yolee599
247 天前
创建一个信号量,执行语句之后就 take 这个信号量,注意 take 的超时间设为无限,这时候就会阻塞。在完成的回调里 give 信号量,这时候就会继续执行下去了。
nothingistrue
247 天前
如果异步方法本身未返回 Feture ,并且你还不能改它的话,放弃吧,无解。你不能期待一个吃草的狼。

如果你的不能改,只是因为框架的限制,不能改方法的返回类型,但可以改方法体的话( 我猜你在用 Spring 的 @async ),最好的解决方案,还是换异步调用的方式,用 JDK 自带的就行,也费不了多少代码。
CompletableFuture.runAsync(() ->{
// 需要异步执行的东西,但这个方法内部,要是同步的,不要转向调用那个写好的异步方法
}).XXX// 这里既有不阻塞的,也有阻塞的,名字忘了,自己找一下。

极端情况下,连 JDK 自带的都用不了,比如你上面那个方法体中,还要再调用其他不返回 Feture 的异步方法,那就只能回滚最传统的方式了。弄个在第三方位置的标志数据,异步方法执行完成时修改标志,主方法调用异步方法后,轮询这个标志数据。但是这也有个前提,你得能改异步方法得执行体,不然就又回到第一段了。
yazinnnn
247 天前
传个回调....

js 里会的东西到了 java 里就不会了吗......
manhere
247 天前
简单粗暴引入一个 eventbus 完事
superedlimited
247 天前
java 的话用 rxjava
listenerri
247 天前
/**
* 那就摆烂
*/
sleep(20);
baolinliu442k
246 天前
@listenerri 简单直接
howfree
246 天前
@listenerri 俺这样做过,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/971833

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX