779 Star 7.1K Fork 2.5K

GVP京东零售 / asyncTool

 / 详情

直接调用CompletableFuture.allOf(futures).get();的副作用

待办的
任务
创建于  
2021-01-19 17:35

在线程调用里面 直接调用CompletableFuture.allOf(futures).get(); 会导致当前线程挂起.
如果串行任务A-B-C-D 会导致 A线程的挂起时间是4个单元的执行时间之和.

还有一个问题, 后继的线程如果已经执行, 前置的线程没运行的话, 直接改变状态后, 不调用future. 但是正在运行的线程没办法打断.

大佬, 我借鉴你这个,自己写了一个线程编排的工具, 这2个问题都可以解决. 看看有没有什么问题?
https://gitee.com/gepengjun/thread-flow

评论 (9)

gepengjun 创建了任务
gepengjun 修改了描述
展开全部操作日志

看不懂,串行A-B-C-D不是都在同一个线程中执行吗?

看不懂,串行A-B-C-D不是都在同一个线程中执行吗?

@nnxiaod 任务都是提交给线程池执行的

@nnxiaod 任务都是提交给线程池执行的

@gepengjun 串行任务只提交入口任务给线程池,并行任务才都提交给线程池。如果要分叉的话才用新线程吧。

@gepengjun 串行任务只提交入口任务给线程池,并行任务才都提交给线程池。如果要分叉的话才用新线程吧。

@nnxiaod 是的,你是对的. 分叉之后交给线程池来执行.
但问题是一样的, A后面并行执行B,C,D. 那么A的挂起时间就是B,C,D中执行最长的那个. 如果B,C,D后续还有任务,A的挂起时间会更长

大佬,请问你在你写的框架里怎么解决这个问题呢?

感觉 beginNext() 后面也不需执行执行了,能不能简单地直接提交给线程池就行?

dev分支的v1.5.1-SNAPSHOP版本解决了这个问题,并加入了很多功能,可以试试看(暂未大规模测试过,可能会有潜在bug)

:smiley: 什么场景下CompletableFuture不够不得不使用asyncTool的

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(6)
303698 tianyalei 1578919857 5696078 tcsn site 1677721730 806907 781927112 1578933374
Java
1
https://gitee.com/jd-platform-opensource/asyncTool.git
git@gitee.com:jd-platform-opensource/asyncTool.git
jd-platform-opensource
asyncTool
asyncTool

搜索帮助