2012-06-19 67 views
-1
public void updatePrice(Price update){ 
    sendPriceUpdate(update); //takes a long time 
} 

我想构造一个类,它将执行上述操作,除了sendPriceUpdate调用仍在运行时它将等待并排队等待更新。一旦通话返回,它将发送上次更新(并放弃其他更新)。即等待发送呼叫返回,然后发送最后一次挂起的价格更新。异步队列 - 只处理最后一条消息

请告诉我合适的数据结构使用?

+0

您标记为“排队”,我想你已经知道合适的数据结构。 –

+0

事情是我不知道如果一个队列是正确的,因为我只想要最后更新..真的需要在队列中存储多个项目。 –

回答

0

最好的解决方案是更新已经知道这一点,只得到“增量”的数据,也就是说,改变了数据或唯一的区别。如果这是不可能的,那么你别无选择,只能回滚最新的更新。为此,您需要存储以前的更新,以便撤消它并推送新的更新。像这样的东西应该工作:

public class Updater 
{ 
    private static Price prevUpdate = null; 

    public static synchronized void updatePrice(Price update) 
    { 
     if (prevUpdate != null) 
     { 
      rollbackUpdate(prevUpdate); 
     } 
     sendPriceUpdate(update); //takes a long time   
     prevUpdate = update; 
    } 
} 

我已经改变了这static,因为我不认为你需要实例这个类的一个对象。看起来像一个静态的服务给我。如果我错了(例如不同的线程想要使用不同的更新程序,并因此跟踪不同的更新),请更改它。

这是线程安全的,但如果sendPriceUpdate()需要很长时间,它可以锁定updatePrice()方法上的很多线程。此外,这不考虑任何异常被抛出,你应该考虑到这一点。

正如我在评论中说,恕我直言,这是一个(非常?)不好解决,但它是唯一一个,如果你不知道这是最后一个或最后一个抵达。重新设计的软件可能会解决这种情况,或者在更高层次上解决它(在调用updatePrice()之前)

+0

这不会起作用,因为它会处理所有的价格更新...我只想处理最新的价格更新。 –

+0

咦?你说:“我想构建一个类,它将执行上述操作,除了sendPriceUpdate调用仍在运行时,它将等待并排队等待更新”。排队不仅仅处理最后一个。请澄清你自己。 – m0skit0

+0

为什么你引用我,甚至不包括整个段落?下一句话明确表示放弃除最后更新之外的所有内容。 –

0

我建议您使用主动对象模式 - 您应该将队列(AKA激活队列或操作队列)你的对象。我将首先解释如何在不丢弃的情况下解决问题,然后解释我应如何处理丢弃问题。 其主要思想是:
A.你的对象有一个队列的领域 - 比方说,一个泛型类型队列的(与PriceOperation通用参数)

B. PriceOperation将举行一个方法对象(java中。 lang.reflect.method),调用的目标对象-let的PriceManager(具有updatePrice方法)和参数(假设为更新它应该是Price)

C. sendPriceUpdate将排队和PriceOperation的对象“更新”的方法,对象(假设价格有这样的一种方法),或方法,你会在同步调用

D.与该物体相关的Wi线程的情况下,已启动LL等待队列,当队列不为空,它会出队PriceOperation对象,并调用目标对象的方法(这是否如果是PriceManager或别的东西)的有关参数(价格对象)

E.通过这种方式,您将能够保留待处理更新的队列,并且仍然与您的PriceManager异步工作

F.我刚刚注意到您有意丢弃上次更新 - 如果是这种情况,那么您应该优先使用优先级队列,而不是队列,并根据时间戳上的优先级排序,以最近创建的PriceOperation进行处理。您需要在过程器(PriceManager)和使用者(线程)之间同步这个队列。

相关问题