Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 设计问题:当多个操作需要服务时,从单个操作或管理器调用服务_Multithreading_Caching - Fatal编程技术网

Multithreading 设计问题:当多个操作需要服务时,从单个操作或管理器调用服务

Multithreading 设计问题:当多个操作需要服务时,从单个操作或管理器调用服务,multithreading,caching,Multithreading,Caching,我有一个执行a、B、C的操作列表(这个列表可以增长),它执行完全不同的操作。每个操作都由单独的java类执行。有一位经理坐在最上面,叫a、B、C 执行操作(A、B、C)的类需要为此调用不同的服务X1、X2、X3、X4、X5。我们有包装类WX1、WX2、WX3、WX4、WX5来调用服务。我们从A、B、C发出的一些呼叫是常见的(比如WX3、WX4)。(可以是A、B、C中的两个,也可以是其中的三个) 现在我们应该从哪里调用X1,X2,X3,X4,X5。理想情况下,A、B、C中的每一个都应该调用所需的服

我有一个执行a、B、C的操作列表(这个列表可以增长),它执行完全不同的操作。每个操作都由单独的java类执行。有一位经理坐在最上面,叫a、B、C

执行操作(A、B、C)的类需要为此调用不同的服务X1、X2、X3、X4、X5。我们有包装类WX1、WX2、WX3、WX4、WX5来调用服务。我们从A、B、C发出的一些呼叫是常见的(比如WX3、WX4)。(可以是A、B、C中的两个,也可以是其中的三个)

现在我们应该从哪里调用X1,X2,X3,X4,X5。理想情况下,A、B、C中的每一个都应该调用所需的服务。但对于所有A、B、C共享的服务,从MngrY调用并将服务调用的输出发送给A、B、C中的每一个是否有意义(这在效率方面是有意义的,但在设计方面是有意义的,因为MngrY不应该知道A、B、C是如何运行的)

所以选择是

  • 从MngrY调用公共服务调用(WX3、WX4),并从单个组件单独调用。设计好吗

  • 拨打MngrY经理的所有服务电话。它会扩大吗?我们将来可能不得不提出大量的服务请求,为了其他人,我们正在阻止每个模块,并且在设计方面使MnagrY了解每个模块的需求

  • 根据需要从单个组件(根据需要)进行所有服务调用,并通过缓存使包装器处理重复的请求。依靠缓存不进行两次调用是否好?服务必须在几毫秒内返回结果,并且不能总是进行两次调用

  • 或者我们应该在WX1,WX2,WX3,。。。确保同一个呼叫不会重复两次

  • 此外,将来我们可能希望从MngrY并行调用A、B、C,因此在这种情况下,缓存可能会产生问题。同一个请求可能不止一次。

    在那些必须执行复杂且多变的操作序列的情况下,我通常求助于具有某种“请求/命令/结果”类的状态机,称之为“OpClass”。管理器加载一个类实例,其中包含定义A、B或C操作、数据、命令枚举、链接、其他类实例以及批所需的所有内容。通过这种方式,OpClass实例拥有以正确顺序执行必要的X1..X5操作所需的所有状态和其他信息(如果顺序重要),并确保操作不会不必要地重复—A、B或C被封装。然后将OpClass发送给A、B或C,这些代理可以根据需要调用X1..X5以完成请求的操作。OpClass应包含用于存储任何结果和错误报告的成员,例如错误消息字符串和/或异常对象,以便在出现问题时使操作返回“早期”,并包含记录错误或稍后重试所需的所有信息

    TBH,我可能也会将A、B和C聚合到OpClass中,从而形成一种“超级”OpClass,只需要加载数据和命令,然后提供执行,例如通过run()方法。之后,使用队列、线程和/或线程池进行并行操作会变得更加简单,实际上几乎是微不足道的:)

    这是相关的还是有意义的