我有一个连接到套接字连接的应用程序,该连接向我发送了很多信息。可以说每秒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是我用来查看订单是否已经存在的键(并且是唯一的)。 “存储库”是一个单例类,“ 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
关于java - Platform.runLater,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18642044/