Java 中如何实现这样的功能

2017-08-18 18:12:49 +08:00
 quietin
像 py 里用 tornado 进行 io 的话, 碰到 io 的代码, 使用 yield 直接异步, 可以等 io 回来之后, 拿到 io 的结果. 再从当前代码往下执行


现在想在 java 里实现类似的功能(并发拿多个请求的结果), 但 java 异步要使用线程池, 这样的话, 主线程和线程池之间需要一个通讯, 如果用 countDownLatch 来进行通知的话, 主线程会阻塞(io 耗时久时); 因为要拿多个结果, 无法直接用主线程来完成

现在需要在收到一个 http 请求后, 用线程池并发地取数据, 如果有一个线程返回数据的话, 主线程就可以返回.
但是目前用这种线程池的做法感觉线程很差. java 的 future 要么是 get(阻塞), 要么是 void 的回调(结果无法 return)到上层.

其实简单来说, 就是遇到一个 http 请求需要等待结果返回的情况下, 如何才能使吞吐量最大?
还望大佬们指教.
4672 次点击
所在节点    Java
22 条回复
niuroumian
2017-08-18 18:22:36 +08:00
用 BlockingQueue 在回掉函数里获取结果,然后主线程取出
doing
2017-08-18 18:24:02 +08:00
Callable+FutureTask 不可以吗
ghos
2017-08-18 18:25:40 +08:00
CompletableFuture ?这个可以支持执行完进行回调的
suantong
2017-08-18 18:29:23 +08:00
简单问题你复杂化了。
ZSeptember
2017-08-18 18:30:30 +08:00
可以看下 Vert.x,就是全部异步,IO 的时候还是要在 Block 线程池中执行,使用的时候配置一下线程池数量就可以了。

其实用异步也只是增加一些并发量而已,QPS 的决定性因素还是 IO,这个也是 Servlet 还是主流的原因了。

而且,Java 写这种异步很麻烦的。
推荐用 Go 吧。
lowzoom
2017-08-18 19:26:14 +08:00
外层传个回调进来就可以了吧,为何一定要 return
lujiajing1126
2017-08-18 19:44:22 +08:00
Java 也有协程实现
quietin
2017-08-18 19:50:14 +08:00
@lowzoom 求详细
quietin
2017-08-18 19:50:40 +08:00
@lujiajing1126 有推荐的实现吗, 生产环境稳定可靠的
mrsatangel
2017-08-18 20:00:31 +08:00
协程:quasar
封装 IO: 裸写 nio/netty
netty 和 quasar 都很稳定
lowzoom
2017-08-18 20:12:37 +08:00
CompletableFuture.supplyAsync(IO 函数)
.thenAccept(外部传进来的回调函数)
quietin
2017-08-18 20:27:13 +08:00
@lowzoom 计算值是 Void, 这样 http 没法返回吧
lowzoom
2017-08-18 20:55:12 +08:00
贴个代码来看看
dphdjy
2017-08-18 21:44:48 +08:00
用 task 结束的时候 post 回去
lujiajing1126
2017-08-18 23:01:00 +08:00
@quietin 10 楼已经提到了
rayingecho
2017-08-18 23:04:11 +08:00
可以用 Kotlin 的协程,跟 Java 完美互操作,不存在隔阂了
zhx1991
2017-08-19 00:14:06 +08:00
你描述的功能就是 future 啊
zhchyu999
2017-08-19 08:37:25 +08:00
yidinghe
2017-08-19 09:11:45 +08:00
Netty 框架就是为了最大化网络吞吐量而编写的。
micean
2017-08-20 11:48:28 +08:00
试用过 java 的伪协程框架,性能还不如走线程池写同步代码
其实涉及到数据库操作的话,如果数据库不支持异步还是得挂线程去 wait 数据

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

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

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

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

© 2021 V2EX