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

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

时间:2023-02-05 21:31:54浏览次数:53  
标签:多线程 组合 依赖 并发 场景 线程 执行 任意 单元


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

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

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

 

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

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

 

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

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

 

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

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

 

5 串并行相互依赖

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

 

6 复杂场景

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

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

传统的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,来控制全组的执行阈值。

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

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

创建线程量少。

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

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

总结

该并发框架提供

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

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

该并发框架已开源,​​https://gitee.com/tianyalei/asyncTool​

 

标签:多线程,组合,依赖,并发,场景,线程,执行,任意,单元
From: https://blog.51cto.com/u_13706148/6038481

相关文章

  • 多线程之CompletableFuture
    目录1.Future回顾代码示例:2.CompletableFuture实现上面示例CompletableFuture创建方式常用的4种创建方式:CompletableFuture源码中有四个静态方法用来执行异步任务区别结果......
  • Java多线程并发06—CAS、AQS
    CAS(CompareAndSwap/Set)概念CAS函数,是比较并交换函数,它是原子操作函数。原理CAS是基于乐观锁的原理进行操作的。它总是认为自己可以成功完成操作。当多个线程同时使用CAS......
  • 24-组合逻辑电路习题课
    组合逻辑电路的习题课三态门从三态门的使能端进行分析CMOS三态门和TTL三态门区别,TTL可以悬空,CMOS不能,需要加一个电阻可以在总线上挂载模块,通过控制开关,控制传输数据的......
  • 多线程
    多线程多任务看起来是多个任务都在做,其实本质上是同一时间只做了一件事情多线程普通方法调用多线程方法调用​ 程序.进程.线程......
  • 多线程之countDownlLatch项目使用
    packagecom.company;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.*;publicclassMain{publicstaticvoidmain(Strin......
  • #yyds干货盘点# LeetCode程序员面试金典:无重复字符串的排列组合
    题目:无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。示例1:输入:S="qwe"输出:["qwe","qew","wqe","weq","ewq","eqw"]示......
  • 23-组合逻辑电路的竞争与冒险
    组合逻辑电路的竞争与冒险竞争与冒险比如,AA'在静态的时候是恒为0得,但是在动态过程中,信号传输都是有传输延迟时间的。信号输入的延迟,会导致信号之间的竞争,有错误输出的......
  • 22-组合逻辑电路
    组合逻辑电路电路分为组合逻辑电路和时序逻辑电路电路分类组合逻辑电路组合逻辑电路:电路的输出与当时的输入有关系,输入发生变化,输出就会跟着变。组合逻辑电路没有反馈......
  • 探秘多线程-闭锁、栅栏与异步编排
    无论是项目开发还是开源代码阅读,多线程都是不可或缺的一个重要知识点,基于这个考量,于是总结出本篇文章,讨论闭锁(CountDownLatch)、栅栏(CyclicBarrier)与异步编排(CompletableF......
  • Java多线程01——多线程的创建
    1进程和线程进程:进程是并发执行程序在执行过程中,资源分配和管理的基本单位。进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。线程:线程是进程的一个执......