尽管已填充,但从单独的线程访问时,ArrayList为空。

时间:2017-05-30 21:15:33

标签: java

我有一个简单的客户端/服务器应用程序。我尝试从UI访问arraylist,但得到一个空的arraylist作为回报。我在互联网上尝试了所有可能的解决方案,但没有一个在我的情况下有效

Server.java

import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class Server {
public static ArrayList<MyThread> clients = new ArrayList<MyThread>();

public static void main(String args[]) throws IOException {
ServerSocket s = new ServerSocket(7777);
try {
while (true) {
Socket s1 = s.accept();
MyThread t = new MyThread(s1);
clients.add(t); // adds threads to an ArrayList
System.out.println(clients); // prints the ArrayList(It works and print all threads)
t.start(); //start the thread

}
} catch (SocketException e) {
System.out.println("Error: " + e);
}
}
}

这是我的UI类中的MouseClickeed方法,我想访问Server Class中的ArrayList

public void mouseClicked(MouseEvent arg0) {
try {

String s = textField.getText();
Client.ClientName = s; \\ gets the string entered and set it as Client Name
System.out.println(Server.clients); \\It's supposed to print Client ArrayList but instead it prints an empty List ([])


}

catch (NullPointerException e1) {
System.out.println("Error: " + e1);
}
}
});

2 个答案:

答案 0 :(得分:0)

您不只是使用单独的线程,而是使用不同的流程。

Server进程拥有自己的Server.class实例。客户端是在不同的java进程中启动的,它可以使用相同的类,但它们将是不同的实例,即使静态字段在不同的进程中也会有所不同。

如果您需要客户端中服务器的数据,则需要进行某种通信。你已经有了tcp / ip socket,所以你可以通过套接字发送列表。

如果要在大型应用程序中使用此模式,也可以使用某些分布式缓存库。例如。 hazelcast或Terracotta DSO

答案 1 :(得分:0)

看起来你试图在带有UI的客户端应用程序中使用来自Server应用程序的对象。

服务器和客户端应用程序是两个不同的进程。 Server.clients在服务器应用程序中使用值初始化,并且未在客户端应用程序中初始化。