求帮忙设计代码 关于异步线程的开启和暂停 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
coderstory
V2EX    Java

求帮忙设计代码 关于异步线程的开启和暂停

  •  
  •   coderstory
    coderstory Nov 8, 2021 2762 views
    This topic created in 1631 days ago, the information mentioned may be changed or developed.

    需求是存在一个任务,是一个单独的线程,任务执行过程中存在多次暂停(比如调用 wait )

    有一个 run 接口启动这个任务,并存在一个 next 接口唤醒这个任务

    2 个接口在启动或者唤醒任务后,等待任务再次暂停,并返回任务中的一些数据。

    需求场景是实现一个代码的测试功能,一串代码存在一系列的断点,前端页面点击下一步才能往下走,并且页面上可以显示对应的变量信息。类似在线 java 代码调试一样的东西。

    16 replies    2021-11-09 09:31:19 +08:00
    zzfer
        1
    zzfer  
       Nov 8, 2021
    看起来这应该需要写多个后端接口控制
    cairnechen
        2
    cairnechen  
      &bsp;Nov 8, 2021 via iPhone   1
    已经伸手到这种程度了吗?
    chendy
        3
    chendy  
       Nov 8, 2021
    不清楚具体的业务场景是啥
    感觉最好还是直接拆成一个 List<Task> 这样的结构,点一下跑一步
    线程不容易控制,还要处理线程销毁超时之类的事情
    smark
        4
    smark  
       Nov 8, 2021
    这不是在描述一个 debug 功能吗
    thetbw
        5
    thetbw  
       Nov 8, 2021
    debug 这种应该一暂停就整个 jvm 暂停了,除非另起个进程,如果是本地线程,查询变量应该不好弄吧,不知道 jni 行不行。
    除非需求再明确一点
    liian2019
        6
    liian2019  
       Nov 8, 2021
    是不是可以把这个任务拆分成多个子任务?类似工作流或者是责任链?
    coderstory
        7
    coderstory  
    OP
       Nov 8, 2021
    @smark 对的 因为每次请求都是不同的线程 所以不知道怎么控制了
    coderstory
        8
    coderstory  
    OP
       Nov 8, 2021
    直接反射读取 变量都存一个 map 里面了
    coderstory
        9
    coderstory  
    OP
       Nov 8, 2021
    @liian2019 这个任务是一堆方法串起来的 具体有多少个 是前端设计页面设计出来的内容决定的 整个代码都是动态生成出来的
    coderstory
        10
    coderstory  
    OP
       Nov 8, 2021
    @cairnechen 对于你这样的顶级大神 任何问题都是伸手
    coderstory
        11
    coderstory  
    OP
       Nov 8, 2021
    @chendy 具体的业务是 前端设计一个流程 一个流程里有多个节点
    流程会转化成一个类 每个节点都是单独的方法

    需求是增加一个调试功能,每个节点走完都暂停 前端显示当前的数据 页面点击下一步 就走到下一个节点
    ys2016814
        12
    ys2016814  
       Nov 8, 2021
    @coderstory 我当时设计过类似的需求,我们的解决方案是,前端在配置流程的时候会有暂停节点,暂停节点的 id 可以设置为-1 或者 0 , 任务的执行器在执行的时候碰到暂停节点会终止任务调用,任务的执行明细即执行记录会存储在对应的库表中,点击下一步或者说继续执行,会调用该任务的执行明细,查看执行到哪一步,继续执行下一个 task 。
    banmuyutian
        13
    banmuyutian  
       Nov 8, 2021
    工作流+状态码+工厂模式应该可以解决
    cairnechen
        14
    cairnechen  
       Nov 8, 2021   1
    @coderstory

    哟,这就开始阴阳怪气了,有点沉不住气啊朋友。只描述问题,自己的想法和思路一点都没有,这大概不是伸手党最常见的做法,哦,可能没腆着脸直接要现成的代码就不叫伸手吧
    wolfie
        15
    wolfie  
       Nov 8, 2021
    @coderstory #11
    上面说的 直接上工作流也可以。

    也可以用反射调用,毕竟是一堆方法。
    不建议线程暂停唤醒,上下文的话想办法持久话就行了。
    duan602728596
        16
    duan602728596  
       Nov 9, 2021
    为什么不使用 generator function 呢
    About     Help     Advertise     Blog     API     FAQ     Solana     4613 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 10:09 PVG 18:09 LAX 03:09 JFK 06:09
    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