Java 整数不会递增吗?

Java 整数不会递增吗?,java,multithreading,networking,integer,Java,Multithreading,Networking,Integer,好的,我正在进行一个客户机/服务器测试,我将整数playerID传递给一个线程,在这个线程中,它将int值提供给一个简单的Player对象,而不是将playerID增加1 public static void main(String[] args) throws IOException { Vector<Player> player = new Vector<Player>(); SlickServer ss = new SlickS

好的,我正在进行一个客户机/服务器测试,我将整数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.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和JTextArea参数。您应该酌情使用synchronize语句包装对players和textArea对象的访问。

new Integer正在客户端线程方法内创建一个全新的Integer实例,调用方无法使用该实例

但是,您需要考虑主线程和客户端线程之间的同步。这可以通过使用非平凡对象或类的同步语句来实现,例如整数的java.util.concurrent.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和JTextArea参数。您应该酌情使用synchronize语句包装对player和textArea对象的访问。

如果需要,请尝试使用IntHolder。

如果需要,请尝试使用IntHolder。

在创建ClientThread后,在main中增加player ID


客户端线程不应负责增加播放机ID。这是main的责任,main负责创建客户端线程并为其提供ID。

在创建ClientThread后,在main中增加播放机ID


客户端线程不应负责增加播放机ID。这是main的责任,main负责创建客户端线程并为其提供ID。

如果要在方法中操作整数,则需要将其封装在对象中

阅读本文以更好地理解

如果要在方法中操作整数,则需要将其封装在对象中

阅读本文以更好地理解

阅读可能会让您了解为什么这没有达到预期效果。如果您想了解更多关于线程间数据共享的信息,我建议在实践中使用Java并发。简言之,如果您没有明确设计用于共享的变量,您永远不知道会得到什么。阅读可能会让您了解为什么这不能达到预期效果。如果您想了解更多关于线程间数据共享的信息,我建议您在实践中使用Java并发。简而言之,如果不显式设计用于共享的变量,您永远不知道会得到什么。ClientThread不应该负责增加ID句号。因为这不是他应该使用的解决方案。显然,他需要学习Java的工作原理,但在这种情况下,他的问题的根源在于,他试图以错误的方式增加他的玩家ID,并将责任放在错误的位置。我真的不明白为什么你要做所有这些共享数据同步的事情,而这只是在定义变量的位置增加。另外,如果只在构造函数中递增同步,则不需要同步,而构造函数是在单个线程上调用的。另外,即使需要同步,也不会有帮助,因为您无法使用SharedData执行原子增量。。。原子整数更好。不要对整数使用锁对象。只需使用原子整数。这就是它的目的。ClientThread不应该负责增加ID,句号。因为这不是他应该使用的解决方案。显然,他需要学习Java的工作原理,但在这种情况下,他的问题的根源在于,他试图以错误的方式增加他的玩家ID,并将责任放在错误的位置。我真的不明白为什么你要做所有这些共享数据同步的事情,而这只是在定义变量的位置增加。另外,如果只在构造函数中递增同步,则不需要同步,而构造函数是在单个线程上调用的。另外,即使需要同步,也不会有帮助,因为您无法使用SharedData执行原子增量。。。原子整数更好。不要对整数使用锁对象。只需使用原子整数。Java不通过引用传递对象。它按值传递引用。这是一个不同的世界。谢谢@dty,我已经删除了错误的细节。Java不会通过引用传递对象
恩斯。它按值传递引用。这是一个不同的世界。谢谢@dty,我已经删除了错误的细节。AtomicInteger是专为这些情况而设计的。AtomicInteger是专为这些情况而设计的。