Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
我可以控制Java侦听器的刷新率吗?_Java_Listener - Fatal编程技术网

我可以控制Java侦听器的刷新率吗?

我可以控制Java侦听器的刷新率吗?,java,listener,Java,Listener,从几天前开始,我就一直在努力解决这个问题,但我无法找到解决方案。 我有一个监听器接收市场数据(买卖订单)。如果市场平静(市场前或市场后(低波动))一切正常。但一旦市场开放,听众接收事件的速度就太快了。因此,几分钟后,我的应用程序冻结。 现在,侦听器只将接收到的数据分配给一个var orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() { @Override

从几天前开始,我就一直在努力解决这个问题,但我无法找到解决方案。 我有一个监听器接收市场数据(买卖订单)。如果市场平静(市场前或市场后(低波动))一切正常。但一旦市场开放,听众接收事件的速度就太快了。因此,几分钟后,我的应用程序冻结。 现在,侦听器只将接收到的数据分配给一个var

orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() {
        @Override
        public void modelChanged(final Change<? extends Order> change) {
                System.out.println("bid event");
                   bidChange = change.getSource();
            }
    });
orderBookBid.getBuyOrders().addListener(新的ObservableListModelListener(){
@凌驾

public void modelChanged(final Change您可以在应用程序中放置负载平衡器,这样它将创建一个队列,而不会冻结应用程序

如果你想让一些事件过去,在你的监听器的逻辑中,你应该有一些东西来检查自从你上次管理事件以来是否已经过了X次

private long timeSinceLastEventManaged = 0;
private final static long MINIMUM_TIME = 2000; //2 seconds
在你的听众中

public void modelChanged(final Change<? extends Order> change) {
    long timeSystem = System.currentTimeMillis();
    if(timeSystem - timeSinceLastEventManaged > MINIMUM_TIME){
        //do your stuff
        timeSinceLastEventManaged  = timeSystem;
    }
}

public void modelChanged(最终更改首先,您应该去掉
println
,因为它实际上是

剩下的取决于你正在做什么。现在看来你只是在获取值并将其写入一个变量。你只能通过这种方式看到最新的更改,如果这是你想要的,那么@TyMarc建议的解决方案就可以了

如果您向我们展示的只是一个示例,并且您确实需要每次更改,那么事情会变得更加复杂。您的
modelChanged
方法应该更改,以便将当前值添加到队列中(例如或)

现在其他人也有问题了。从字面上说。如果
线程
无法处理数据流入,队列的大小将不断增加,直到内存耗尽或达到其他限制。但这是另一回事


是的,这一切都不会编译,因为我只想展示一个示例

您在生产代码中没有使用println??在应用程序和LoadBalancing源之间放置一个消息队列我只需要最后一个值。订单是一个快照,有最好的60到100个出价订单(在getSellOrders侦听器中的ask)。如果没有新订单,则会一次又一次发送相同的快照。println不在生产代码中。同步解决方案是我已经尝试过的,但没有成功。我将尝试@TyMarc的解决方案,但2秒太多了,我将尝试200或300秒。现在市场关闭,我无法检查它。现在一切正常。TY@fpi如果我的答案对你有用,尼禄可以随意接受。其他人可能也会觉得它有用。我接受了@TyMarc answer。如果你需要处理更少的事件,它可以解决问题。这就是我所问的。但问题似乎与ObservableListModelListener有关。在侦听器中什么都不做,程序就会冻结。我已经联系了w和API供应商一起,他们正在调查这个问题。同时我在想,如果连接、断开侦听器可以帮助我保持应用程序的活力。
public void modelChanged(final Change<? extends Order> change) 
        {
            syncronized(syncObject)
            {
               //add to your preffered queue
               syncObject.notifyAll()
            }
        }
Order current;
while(keeprunning)
{
   syncronized(syncObject)
   {
      if(queue.hasNext())
      {
        current = queue.getNext()
      }
      else
      {
        Thread.wait()
      }
   }

   //do the real work here
}