469 Star 3.1K Fork 1.2K

GVP京东零售 / asyncTool

 / 详情

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

Backlog
Task
Opened this issue  
2021-01-19 17:35

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

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

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

Attachments

Comments (6)

gepengjun created任务
gepengjun changed description
展开全部操作日志

看不懂,串行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的挂起时间会更长

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

Sign in to comment

状态
Assignees
Projects
Milestones
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
Branches
Planed to start   -   Planed to end
-
Top level
Priority
Duration (hours)
确定
参与者(4)
303698 tianyalei 1578919857 5696078 tcsn site 1594960141
Java
1
https://gitee.com/jd-platform-opensource/asyncTool.git
git@gitee.com:jd-platform-opensource/asyncTool.git
jd-platform-opensource
asyncTool
asyncTool

Search

102255 3a0e046c 1850385 102255 7aaa926c 1850385