比如有个方法 是 public void searchxx 那么里面调用了一个自己框架里的异步方法,没有返回值,另外的方法调用这个 search 方法的时候怎么等到它执行完之后,怎么把它变阻塞,才进行下一步?有没有大佬指点一下,比较简单的,不涉及到框架代码重写的,只能修改 search 方法
1
lvxiaomao 2023-09-07 19:38:51 +08:00 1
1 、如果要阻塞,那为啥 search 里面是异步执行?
2 、异步使用 future 返回,future 等待结果完成 再做 search 的 return 呗 |
2
wctml 2023-09-07 19:38:58 +08:00 1
协程
|
3
unregister OP |
4
unregister OP @wctml 我们是 java 8 的
|
5
mango88 2023-09-07 19:46:07 +08:00 1
你框架里异步方法可以改吗
|
6
minho 2023-09-07 19:59:35 +08:00 1
用 CountDownLatch 试试
|
7
leonshaw 2023-09-07 20:05:28 +08:00 via Android 1
异步方法完成是怎么通知的
|
8
gosidealone 2023-09-07 20:09:40 +08:00 2
CompletableFuture
|
9
leeton 2023-09-07 20:31:05 +08:00 via iPhone 1
我懂了你的意思,你调用了一个框架方法,它是异步的且没有返回值。你又不能修改框架方法,那就看看这个方法的参数能不能搞一个子类,弄一个 CountDownLatch 上去。
|
11
imokkkk 2023-09-07 20:53:39 +08:00 1
CompletableFuture 感觉很好用 现在代码里异步基本都用它处理了 可以看下这篇文章
https://mp.weixin.qq.com/s/GQGidprakfticYnbVYVYGQ |
12
kaneg 2023-09-07 20:59:03 +08:00 via iPhone 1
search 没有结果你怎么使用?还是把代码脱敏后贴上来大家才能帮你想办法,不然都是猜
|
13
yolee599 2023-09-07 21:11:01 +08:00 via Android 1
创建一个信号量,执行语句之后就 take 这个信号量,注意 take 的超时间设为无限,这时候就会阻塞。在完成的回调里 give 信号量,这时候就会继续执行下去了。
|
14
nothingistrue 2023-09-07 21:29:08 +08:00 1
如果异步方法本身未返回 Feture ,并且你还不能改它的话,放弃吧,无解。你不能期待一个吃草的狼。
如果你的不能改,只是因为框架的限制,不能改方法的返回类型,但可以改方法体的话( 我猜你在用 Spring 的 @async ),最好的解决方案,还是换异步调用的方式,用 JDK 自带的就行,也费不了多少代码。 CompletableFuture.runAsync(() ->{ // 需要异步执行的东西,但这个方法内部,要是同步的,不要转向调用那个写好的异步方法 }).XXX// 这里既有不阻塞的,也有阻塞的,名字忘了,自己找一下。 极端情况下,连 JDK 自带的都用不了,比如你上面那个方法体中,还要再调用其他不返回 Feture 的异步方法,那就只能回滚最传统的方式了。弄个在第三方位置的标志数据,异步方法执行完成时修改标志,主方法调用异步方法后,轮询这个标志数据。但是这也有个前提,你得能改异步方法得执行体,不然就又回到第一段了。 |
15
yazinnnn 2023-09-07 22:17:51 +08:00
传个回调....
js 里会的东西到了 java 里就不会了吗...... |
16
manhere 2023-09-07 22:42:47 +08:00
简单粗暴引入一个 eventbus 完事
|
17
superedlimited 2023-09-08 01:35:45 +08:00 via iPad
java 的话用 rxjava
|
18
listenerri 2023-09-08 10:52:28 +08:00
/**
* 那就摆烂 */ sleep(20); |
19
baolinliu442k 2023-09-09 08:58:45 +08:00
@listenerri 简单直接
|
20
howfree 2023-09-09 14:06:19 +08:00
@listenerri 俺这样做过,哈哈
|
21
SoloCompany 2023-09-09 21:15:36 +08:00
还有一种上面没提到的方案, 就是 spawn 代替 call, 代价就是需要启动一个额外的进程来执行目标代码
|
22
trzzzz 2023-09-11 08:27:18 +08:00 via iPhone
要同步要异步有点矛盾。建议都用 CompletableFuture 包装,没有返回值直接用 thenRun
|