任意组合、编排的多线程并发框架,支持任意阻塞、等待、串并行组合,回调、超时、默认值等

2019-12-30 17:58:36 浏览数 (1)

并发场景可能存在的需求之——任意编排

1 多个执行单元的串行请求

2 多个执行单元的并行请求

3 阻塞等待,串行的后面跟多个并行

4 阻塞等待,多个并行的执行完毕后才执行某个

5 串并行相互依赖

6 复杂场景

并发场景可能存在的需求之——每个执行结果的回调

传统的Future、CompleteableFuture一定程度上可以完成任务编排,并可以把结果传递到下一个任务。如CompletableFuture有then方法,但是却无法做到对每一个执行单元的回调。譬如A执行完毕成功了,后面是B,我希望A在执行完后就有个回调结果,方便我监控当前的执行状况,或者打个日志什么的。失败了,我也可以记录个异常信息什么的。

此时,传统的就无能为力了。

我的框架提供了这样的回调功能。并且,如果执行失败、超时,可以在定义这个执行单元时就设定默认值。

并发场景可能存在的需求之——执行顺序的强依赖和弱依赖

如上图的3,A和B并发执行,最后是C。

有些场景下,我们希望A和B都执行完毕后,才能执行C,CompletableFuture里有个allOf(futures...).then()方法可以做到。

有些场景下,我们希望A或者B任何一个执行完毕,就执行C,CompletableFuture里有个anyOf(futures...).then()方法可以做到。

我的框架同样提供了类似的功能,通过设定wrapper里的addDepend依赖时,可以指定依赖的任务是否must执行完毕。如果依赖的是must要执行的,那么就一定会等待所有的must依赖项全执行完毕,才执行自己。

如果依赖的都不是must,那么就可以任意一个依赖项执行完毕,就可以执行自己了。

并发场景可能存在的需求之——依赖上游的执行结果作为入参

譬如A-B-C三个执行单元,A的入参是String,出参是int,B呢它需要用A的结果作为自己的入参。也就是说A、B并不是独立的,而是有结果依赖关系的。

在A执行完毕之前,B是取不到结果的,只是知道A的结果类型。

那么,我的框架也支持这样的场景。可以在编排时,就取A的结果包装类,作为B的入参。虽然此时尚未执行,必然是空,但可以保证A执行完毕后,B的入参会被赋值。

并发场景可能存在的需求之——全组任务的超时

一组任务,虽然内部的各个执行单元的时间不可控,但是我可以控制全组的执行时间不超过某个值。通过设置timeOut,来控制全组的执行阈值。

并发场景可能存在的需求之——高性能、低线程数

该框架全程无锁,没有一个加锁的地方。

创建线程量少。

如这样的,A会运行在B、C执行更慢的那个单元的线程上,而不会额外创建线程。

总结

该并发框架提供

> 1 提供任何形式的串行、并行执行单元的组合。如a、b、c的串行,a、b的串行同时与c并行,a、b、c的并行 > 2 为每个执行单元提供执行成功、失败、超时、异常的回调 > 3 支持为单个执行单元设置异常、失败后的默认值 > 4 支持为整个group(多个任意组合的执行单元)设置超时时间。单个执行单元失败,不影响其他单元的回调和最终结果获取。如果自己依赖的任务失败,则自己也立刻失败。 > 5 整个group执行完毕或超时后,同步阻塞返回所有执行单元结果集,按添加的顺序返回list。也支持整个group的异步回调不阻塞主线程 > 6 支持每个group独享线程池,或所有group共享线程池(默认)

0 人点赞