Wil*_*iam 1 java networking multithreading integer
好吧,所以我正在进行客户端/服务器测试,我将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);
}
Run Code Online (Sandbox Code Playgroud)
这是在线程中增加它的地方:
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;
}
Run Code Online (Sandbox Code Playgroud)
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.
}
}
Run Code Online (Sandbox Code Playgroud)
您需要考虑如何在并发执行的线程之间共享数据.这也适用于Vector<Player>
和JTextArea
参数.您应该根据需要使用语句包装对players
和textArea
对象的访问synchronize
.
归档时间: |
|
查看次数: |
2554 次 |
最近记录: |