0

私はソケット接続に接続するアプリを持っており、その接続は私に多くの情報を送信します..1秒あたり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 です。

4

1 に答える 1

1

が複数のスレッドによって実行される場合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
于 2013-09-05T18:00:42.333 に答える