2016-03-28 6 views
2

私は自分のゲームで認証を行い、マッチメイキングを担当しています。ArrayListが別のスレッドで空になっています

私はマッチメイキングのために使用するルームのArrayListを持っています(部屋はゲームのプレイヤーのリストを追跡しています)。

メインクラスであり、すべてを実行するPoulpiciousServer.javaと、別のスレッドで実行されるMatchmakingEngineという2つのシングルトンがあり、プレイする部屋を要求するプレーヤーを処理します。だから、メインクラスで私はテストのための新しいルームを追加

package com.poulpicious.server; 

import java.util.ArrayList; 

import com.poulpicious.network.packets.Packet05MatchmakingResponse; 

public class MatchmakingEngine implements Runnable { 

    private static class MatchmakingEngineHolder { 
     private static final MatchmakingEngine _instance = new MatchmakingEngine(); 
    } 

    public static MatchmakingEngine get() { 
     return MatchmakingEngineHolder._instance; 
    } 

    private boolean running; 

    private ArrayList<ServerPlayer> playersSearching = new ArrayList<ServerPlayer>(); 

    public MatchmakingEngine() { 
     this.running = true; 
    } 

    @Override 
    public void run() { 
     while (running) { 
      if (PoulpiciousServer.get().getRooms().size() > 0) 
       System.out.println(PoulpiciousServer.get().getRooms().size()); 

      synchronized (playersSearching) { 
       // System.out.println(playersSearching.size()); 
       if (playersSearching.size() > 0) { 
        System.out.println("Matching a player"); 
        ServerPlayer current = playersSearching.get(0); 

        PoulpiciousServer.get().getRoom(0).addPlayer(current); 

        Packet05MatchmakingResponse pmr = new Packet05MatchmakingResponse(); 
        pmr.nbPlayers = PoulpiciousServer.get().getRoom(0).getPlayerCount(); 
        current.getConnection().sendTCP(pmr); 
        playersSearching.remove(0); 
       } 
      } 
     } 
    } 

    public void registerPlayer(ServerPlayer player) { 
     synchronized (playersSearching) { 
      this.playersSearching.add(player); 
     } 
    } 

} 

、そう:

package com.poulpicious.server; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import com.esotericsoftware.kryo.Kryo; 
import com.esotericsoftware.kryonet.Connection; 
import com.esotericsoftware.kryonet.Server; 
import com.poulpicious.network.packets.Packet00Login; 
import com.poulpicious.network.packets.Packet01LoginAcknowledge; 
import com.poulpicious.network.packets.Packet02CharacterInfos; 
import com.poulpicious.network.packets.Packet03CharacterInfosResponse; 
import com.poulpicious.network.packets.Packet04RequestMatchmaking; 
import com.poulpicious.network.packets.Packet05MatchmakingResponse; 
import com.poulpicious.network.packets.Packet06StopMatchmaking; 

public class PoulpiciousServer { 

    private static class PoulpiciousServerHolder { 
     private static final PoulpiciousServer _instance = new PoulpiciousServer(); 
    } 

    public static PoulpiciousServer get() { 
     return PoulpiciousServerHolder._instance; 
    } 

    private Server server; 

    private Map<Integer, ServerPlayer> serverPlayers = new HashMap<Integer, ServerPlayer>(); 
    private List<Room> rooms; 

    private Thread matchmakingEngineThread; 

    public PoulpiciousServer() { 
     this.server = new Server(); 
     this.rooms = Collections.synchronizedList(new ArrayList<Room>()); 

     Kryo k = this.server.getKryo(); 
     k.register(Packet00Login.class); 
     k.register(Packet01LoginAcknowledge.class); 
     k.register(Packet02CharacterInfos.class); 
     k.register(Packet03CharacterInfosResponse.class); 
     k.register(Packet04RequestMatchmaking.class); 
     k.register(Packet05MatchmakingResponse.class); 
     k.register(Packet06StopMatchmaking.class); 
    } 

    public void run() { 
     try { 
      this.rooms.add(new Room()); 
      server.addListener(new PoulpiciousServerListener(this)); 

      this.matchmakingEngineThread = new Thread(MatchmakingEngine.get(), "matchmaking"); 
      this.matchmakingEngineThread.start(); 

      server.start(); 
      server.bind(25565, 25565); 

      System.out.println("Master server started."); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void registerPlayer(Connection c, String username) { 
     this.serverPlayers.put(c.getID(), new ServerPlayer(c, username)); 
    } 

    public static void main(String[] args) { 
     new PoulpiciousServer().run(); 
    } 

    public ServerPlayer getServerPlayer(int connID) { 
     return this.serverPlayers.get(connID); 
    } 

    public Room getRoom(int index) { 
     synchronized (rooms) { 
      return this.rooms.get(0); 
     } 
    } 

    public List<Room> getRooms() { 
     return rooms; 
    } 

} 

そして、マッチメーキング・エンジン:ここ

は、クラス(私はKryoNetを使用)しています部屋リストには少なくとも1室が含まれています。

マッチメーキングエンジンでは、実行方法でこのリストのサイズを印刷しますが、リストは空であるため表示しません。

問題は、このリストをどこにも空けないことです。なぜ、それが他のスレッドで空であるのか理解できません。私はテストのために、同期、Collections.synchronizedList、さえのConcurrentMapを使用

、どれも働いていない...

をどのように私は、リストは本当にスレッドセーフであると理由もなく空にされていないことを確認することができますか?

+2

あなたの 'main'メソッドに' 'PoulpiciousServer()。run()'を書くと、 '' PoulpiciousServer.get()。run() 'を使っていないのはなぜですか?確かに 'PoulpiciousServer'はシングルトンではありませんか? –

+0

ああ私の神...ありがとう.. –

答えて

2

PoulpiciousServerはシングルトンではありません。

  • 、あなたが唯一作成したものでPoulpiciousServer.run()を呼び出すPoulpiciousServer.main方法

内の1つのインスタンスを作成しますPoulpiciousServerHolderクラス

  • 内の1つのインスタンスを作成しますmainの方法では、

    PoulpiciousServer.get()によって返されたインスタンスの部屋リストにアクセスします。これはPoulpiciousServerHolderクラスで作成されたインスタンスです。 run()メソッドは決して呼び出されないので、この部屋にはどのルームも追加されません。

    mainメソッドのnew PoulpiciousServer()の使用をPoulpiciousServer.get()に置き換えてください。

  • +0

    私はそれを変更し、それは働いた。私は本当にこれを見ていない!どうもありがとうございました。 –

    関連する問題