【发布时间】:2016-02-01 06:55:42
【问题描述】:
我现在真的迷路了。
我有这个Server,它为每个连接的客户端创建一个新的Thread,所以它看起来像这样:
Server.java
...
( new ServerReceiver( toClient, this.connectedPlayersObject ) ).start();
...
(toClient 是 ObjectOutputStream,this.connectedPlayerObject 是操作 ArrayList 的对象)
在
时调用...
Socket socket = this.serverSocket.accept();
this.connectedPlayersObject.add( thisPlayer );
...
无论如何,在我的 Server.java 中一切正常,但在我上面显示的那个线程中,我有这个:
ServerSender.java ( Thread )
...
private ConnectedPlayers CPO;
private ArrayList<Players> CPL;
public ServerSender( ObjectOutputStream _toClient, ConnectedPlayers _CPO ) {
super( "ServerSender" );
this.CPL = _CPO.get(); // returns the whole ArrayList that I have in this moment
this.CPO = _CPO // remember the object
}
public void run() {
while( true ) {
// here if the Server which starts the Thread is adding something to
// this.CPO's ArrayList, this.CPL gets that element inside of it too, why?
this.printCPLs( this.CPL, this.CPO.get() ); // Prints both ArrayLists Nicely
}
}
...
即使我从未更新 this.CPL,它们也总是打印相同的更新后的 ArrayList!
正如您在上面看到的,Server.java,每次客户端连接时,它都会将客户端添加到ConnectedPlayers 对象中的ArrayList,所以在线程中,我期待得到正确的ArrayList 时我打电话给.get();,但我在私有属性this.CPL 和this.CPO.get(); 上都得到了正确/更新的元素,所以我不知道ArrayList 何时真正从一个状态变为另一个状态
编辑:对象女巫操纵 ArrayList(CPO / connectedPlayersObject):
ConnectedPlayers.java
public class ConnectedPlayers implements Serializable {
private static final long serialVersionUID = -3225902114667506709L;
private ArrayList<Player> connectedPlayers;
public ConnectedPlayers() {
this.connectedPlayers = new ArrayList<Player>();
}
public synchronized void add( Player _player ) { this.connectedPlayers.add( _player ); this.notifyChange(); }
public ArrayList<Player> get() { return this.connectedPlayers; }
private void notifyChange() { }
}
【问题讨论】:
-
对不起,这个很不清楚。 “而且他们总是打印同样的东西,即使我从来没有更新 this.CPL”。如果您从不更新它,它应该保持不变。你是什么意思?同时显示更多代码,包括
CPL和CPO的声明。 -
Server.java 在客户端从对象
CPO连接到 ArrayList 时添加客户端,该对象具有一些操作该 ArrayList 的方法(例如.get();获取 ArrayList 或.add();添加ArrayList 的客户端)。在线程中,我得到那个对象,我得到当前的 ArrayList 并将其设置为属性CPL,当服务器通过CPO.add();向该 ArrayList 添加一些东西时,具有初始 ArrayList 的属性被更新,即使我不不要在线程中更新它。我不知道..老实说如何让它更清楚,我知道它有点乱...... -
@JimGarrison 完全一样,它应该保持不变,但它不会,它会在
this.CPO中的 ArrayList 更新时更新
标签: java multithreading arraylist server client