Целое число не будет увеличиваться? - PullRequest
1 голос
/ 28 сентября 2010

Хорошо, у меня идет проверка клиент / сервер, и я передаю Integer playerID потоку, в котором он присваивает значение int простому объекту Player, а затем увеличивается playerID на 1.

 public static void main(String[] args) throws IOException {

        Vector<Player> player = new Vector<Player>();

        SlickServer ss = new SlickServer();
        ss.setVisible(true);

        ServerSocket serverSocket = new ServerSocket(4444);
        boolean listening = true;

        Integer playerID = new Integer(0);

        while(listening){
            ss.textArea.append("Waiting to connect with player: " + playerID.intValue()  + "\n");
            new ClientThread(serverSocket.accept(), player, playerID, ss.textArea).start();
            ss.textArea.append("Waiting to connect with player: " + playerID.intValue() + "\n");
        }

        serverSocket.close();
        System.exit(0);
    }

и вот где оно увеличивается в потоке:

public ClientThread(Socket acceptedSocket, Vector<Player> players, Integer playerID, JTextArea textArea){
        super("ClientThread");
        this.acceptedSocket = acceptedSocket;
        this.players = players;
        players.add(new Player(50,50, playerID.intValue()));

        if(players != null)
            System.out.println("Not Null: " + players.size());

        boolean b = false;
        for(int i = 0; i < players.size(); i++){
            if(!b){
                if(players.get(i).id == playerID){
                    me = players.get(i);
                    b = true;
                }
            }
        }

        playerID = new Integer(playerID.intValue() + 1);
        this.textArea = textArea;
    }

Ответы [ 4 ]

7 голосов
/ 28 сентября 2010

new Integer создает новый экземпляр Integer внутри метода потока клиента, который не доступен вызывающей стороне.

Однако вам необходимо учитывать синхронизацию между основным и клиентским потоком. Это может быть достигнуто с помощью операторов synchronized для нетривиальных объектов или классов, таких как java.util.concurrent.atomic.AtomicInteger для целых чисел, следующим образом:

AtomicInteger playerID = new AtomicInteger(0);
while (listening) {
  ss.textArea.append("Waiting to connect with player: " + playerID.get()  + "\n");
  new ClientThread(serverSocket.accept(), player, playerID, ss.textArea).start();
  ss.textArea.append("Waiting to connect with player: " + playerID.get() + "\n");
}

class ClientThread {
  public ClientThread(Socket acceptedSocket, Vector<Player> players, AtomicInteger playerID, JTextArea textArea) {
    // etc.
    playerID.incrementAndGet();
    // etc.
  }
}

Вам нужно подумать о том, как обмениваться данными между одновременно выполняющимися потоками. Это относится также к аргументам Vector<Player> и JTextArea. Вы должны обернуть доступ к объектам players и textArea, используя соответствующие операторы synchronize.

2 голосов
/ 28 сентября 2010

Увеличение идентификатора игрока на main после создания ClientThread.

Поток клиента не должен отвечать за увеличение идентификатора игрока.Это ответственность main, которая создает клиентские потоки и присваивает им их идентификаторы.

0 голосов
/ 28 сентября 2010

Если вы хотите манипулировать целым числом в методе, вам нужно инкапсулировать его в объекте.

Прочтите эту статью для лучшего понимания http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

0 голосов
/ 28 сентября 2010

Попробуйте использовать IntHolder, если вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...