簡體   English   中英

整數不會增加?

[英]Integer won't increment?

好的,我正在進行客戶端/服務器測試,我將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;
    }

new Integer正在客戶端線程方法內創建一個全新的Integer實例,該實例對調用者不可用。

但是,您需要考慮主線程和客戶端線程之間的同步。 這可以通過對非平凡對象或類(例如java.util.concurrent.atomic.AtomicInteger的整數使用synchronized語句來實現,如下所示:

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參數。 你應該換行訪問,以playerstextArea使用對象synchronize陳述合適。

創建ClientThread后,在main增加玩家ID。

客戶端線程不應該負責增加玩家ID。 這是main的責任,即創建客戶端線程並為其提供ID的職責。

如果需要,請嘗試使用IntHolder

如果要在方法中操作整數,則需要將其封裝在對象中。

閱讀本文以獲得更好的理解http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM