Java Platform.runLater

Java Platform.runLater,java,javafx,observablelist,Java,Javafx,Observablelist,我有一个连接到套接字连接的应用程序,该连接会向我发送大量信息。。比如说每秒300个订单(可能更多)。。我有一个类(它就像一个监听器,对某个事件作出反应,并且该事件具有顺序)接收该顺序。。创建一个对象,然后将其添加到ObservableList(它是tableView的源)。。这样,我的GUI就显示了这个顺序。但是问题来了,如果这个顺序已经存在于observableList上。。我不能添加它..我必须更新它(我是这样做的)。。但有时。。对于某些订单,此条件不起作用,订单将再次添加 我会告诉你如何使

我有一个连接到套接字连接的应用程序,该连接会向我发送大量信息。。比如说每秒300个订单(可能更多)。。我有一个类(它就像一个监听器,对某个事件作出反应,并且该事件具有顺序)接收该顺序。。创建一个对象,然后将其添加到ObservableList(它是tableView的源)。。这样,我的GUI就显示了这个顺序。但是问题来了,如果这个顺序已经存在于observableList上。。我不能添加它..我必须更新它(我是这样做的)。。但有时。。对于某些订单,此条件不起作用,订单将再次添加

我会告诉你如何使用一些代码

 public class ReceivedOrderListener 
 {
     ev = Event; //Supose that this is the event with the order
     if(!Repository.ordersIdMap.containsKey(ev.orderID))
     {    

         Platform.runLater(new Runnable() 
         {
            @Override public void run() 
            {                                                                    
                Repository.ordersCollection.add(ev.orderVo);                        
            }
         } 
      });
      Repository.ordersIdMap.put(ev.orderID, ev.orderVo);
  }

好的,现在。。这是我代码的简历。ev是我的事件,包含订单的所有信息,orderID是我用来查看订单是否已经存在的关键(yeah是唯一的)。“Repository”是一个单例类,“ordersCollection”是一个ObservableList,“ordersIdMap”是一个HashMap如果由多个线程执行
ReceivedOrderListener
,那么它看起来像是“检查然后执行”竞争条件

-> ORDER1 comes to the listener
T1 checks ordersIdMap.containsKey(ORDER1) it returs false
T1 proceeds to do Platform.runLater to add the order
-> ORDER1 comes to the listener again
-> T2 checks ordersIdMap.containsKey(ORDER1) it returs false again
now T1 proceeds to do ordersIdMap.put(ORDER1)
-> T2 proceeds to do Platform.runLater to add the order again

续。。在这个hashmap中,我放置了“orderID”和order对象,因此当新订单到达时,我会询问该orderID是否已经存在,如果不存在,我会调用platform.runLater。。这样,我的订单就被添加到ordersCollection中并显示在tableView中,效果很好。。但有时订单已经存在,但仍会执行此代码。。我没有输入else代码,但它也更新了一些已经存在的订单(因此在某些情况下……它是有效的)。我想问题在于我收到的订单太多了,因为我在不到一分钟的时间里收到了10000份订单。。GUI没有冻结,但我只是遇到了我提到的问题。。也许“runLater”的反应没有那么快,有时就是无法处理我所做的大量请求,或者我使用了错误的方法来更新GUI。无论如何,我希望有人能理解并回答(我知道我的英语很差,对不起)。谢谢如何通知您的听众?如果可以并发调用,那么问题可能是由于它们并发访问相同的
存储库.ordersIdMap
HashMap,这不是线程安全的。试着改用a。我把它改为ConcurrentHashMap,但它发生了同样的事情。侦听器读取一个队列,因此假设我在一个队列中有1000个订单。。听者读第一个。。结束它,下一个进来。。这就是它的工作原理。我真的认为问题出在平台上。稍后运行。。我还把if条件放在了公共的void运行中,它比它的外部运行更好。。但还是重复了一些订单(更少)。我编辑了我的帖子,因为我错了。。侦听器读取一个队列,因此假设我在一个队列中有1000个订单。。听者读第一个。。结束它,下一个进来。。这就是它的工作原理,我仍然有这个问题(所以它不是多线程)。我真的认为问题出在平台上。稍后运行。。我还把if条件放在了公共的void运行中,它比它的外部运行更好。。但是仍然复制了一些订单(更少)。你可以尝试另一种方法。我删除了“Platform.runLater”,如果订单不存在,就添加订单。。而且很有效!!。。但是在输出屏幕中,JavaFX向我抛出一个错误。。“com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:291)”中的java.lang.NullPointerException特定行是Repository.ordersCollection.add(orderVo);因此,我认为对GUI来说,这是很快的。。一种方法根本不起作用(Platform.runLater),而另一种方法起作用,但会给我带来这个错误。。