Java 中如何实现这样的功能 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
quietin
V2EX    Java

Java 中如何实现这样的功能

  •  
  •   quietin 2017-08-18 18:12:49 +08:00 5263 次点击
    这是一个创建于 3042 天前的主题,其中的信息可能已经有所发展或是发生改变。
    像 py 里用 tornado 进行 io 的话, 碰到 io 的代码, 使用 yield 直接异步, 可以等 io 回来之后, 拿到 io 的结果. 再从当前代码往下执行


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

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

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

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

    而且,Java 写这种异步很麻烦的。
    推荐用 Go 吧。
    lowzoom
        6
    lowzoom  
       2017-08-18 19:26:14 +08:00
    外层传个回调进来就可以了吧,为何一定要 return
    lujiajing1126
        7
    lujiajing1126  
       2017-08-18 19:44:22 +08:00 via iPhone
    Java 也有协程实现
    quietin
        8
    quietin  
    OP
       2017-08-18 19:50:14 +08:00
    @lowzoom 求详细
    quietin
        9
    quietin  
    OP
       2017-08-18 19:50:40 +08:00
    @lujiajing1126 有推荐的实现吗, 生产环境稳定可靠的
    mrsatangel
        10
    mrsatangel  
       2017-08-18 20:00:31 +08:00
    协程:quasar
    封装 IO: 裸写 nio/netty
    netty 和 quasar 都很稳定
    lowzoom
        11
    lowzoom  
       2017-08-18 20:12:37 +08:00   1
    CompletableFuture.supplyAsync(IO 函数)
    .thenAccept(外部传进来的回调函数)
    quietin
        12
    quietin  
    OP
       2017-08-18 20:27:13 +08:00
    @lowzoom 计算值是 Void, 这样 http 没法返回吧
    lowzoom
        13
    lowzoom  
       2017-08-18 20:55:12 +08:00
    贴个代码来看看
    dphdjy
        14
    dphdjy &nbs;
       2017-08-18 21:44:48 +08:00 via Android
    用 task 结束的时候 post 回去
    lujiajing1126
        15
    lujiajing1126  
       2017-08-18 23:01:00 +08:00 via iPhone
    @quietin 10 楼已经提到了
    rayingecho
        16
    rayingecho  
       2017-08-18 23:04:11 +08:00
    可以用 Kotlin 的协程,跟 Java 完美互操作,不存在隔阂了
    zhx1991
        17
    zhx1991  
       2017-08-19 00:14:06 +08:00
    你描述的功能就是 future 啊
    zhchyu999
        18
    zhchyu999  
       2017-08-19 08:37:25 +08:00
    yidinghe
        19
    yidinghe  
       2017-08-19 09:11:45 +08:00 via Android
    Netty 框架就是为了最大化网络吞吐量而编写的。
    micean
        20
    micean  
       2017-08-20 11:48:28 +08:00
    试用过 java 的伪协程框架,性能还不如走线程池写同步代码
    其实涉及到数据库操作的话,如果数据库不支持异步还是得挂线程去 wait 数据
    quietin
        21
    quietin  
    OP
       2017-08-21 12:00:15 +08:00
    @micean 主要是网络 io
    micean
        22
    micean  
       2017-08-22 00:03:19 +08:00
    @quietin java 毕竟不优雅,要么适应异步的写法,要么使用楼上的 kotlin 之类的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2370 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 15:49 PVG 23:49 LAX 07:49 JFK 10:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86