V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coderstory
V2EX  ›  Java

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

  •  
  •   coderstory ·
    coderstory · 2021-11-08 09:57:39 +08:00 · 2148 次点击
    这是一个创建于 1122 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    也可以用反射调用,毕竟是一堆方法。
    不建议线程暂停唤醒,上下文的话想办法持久话就行了。
    duan602728596
        16
    duan602728596  
       2021-11-09 09:31:19 +08:00
    为什么不使用 generator function 呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5460 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:51 · PVG 16:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.