在Java中向线程发送ArrayList时,如何执行多线程和套接字编程

在Java中向线程发送ArrayList时,如何执行多线程和套接字编程,java,multithreading,sockets,data-structures,Java,Multithreading,Sockets,Data Structures,基本上,我需要解析XML文件,将其放入类对象的ArrayList中,并将其(以及套接字)传递给线程。然后,该线程将对给定的ArrayList执行一些功能,并将结果传递回套接字。我的问题是,我无法将解析后的数据以ArrayList的形式传递给线程 下面是一些代码: public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listeni

基本上,我需要解析XML文件,将其放入类对象的ArrayList中,并将其(以及套接字)传递给线程。然后,该线程将对给定的ArrayList执行一些功能,并将结果传递回套接字。我的问题是,我无法将解析后的数据以ArrayList的形式传递给线程

下面是一些代码:

 public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = null;
    boolean listening = true;

  /*xml parsing is done, result is saved in ArrayList<class> peds*/

 try {

        serverSocket = new ServerSocket(4444);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 4444." + e);
        System.exit(-1);
    }

    while (listening){ 
    Socket s = serverSocket.accept();
        Runnable proExec = new KKMultiServerThread( s, peds); **
        Thread th = new Thread (proExec)
        th.start(); }

    serverSocket.close();

    }


class KKMultiServerThread implements Runnable{
private Socket socket = null;
public final ArrayList<show> peds;

public KKMultiServerThread(Socket socket, ArrayList<show> peds) {

this.socket = socket;
    this.peds = peds;
        }
publicstaticvoidmain(字符串[]args)引发IOException{
ServerSocket ServerSocket=null;
布尔监听=真;
/*xml解析完成后,结果保存在ArrayList peds中*/
试一试{
serverSocket=新的serverSocket(4444);
}捕获(IOE异常){
System.err.println(“无法在端口4444上侦听。”+e);
系统退出(-1);
}
边听边听{
sockets=serverSocket.accept();
Runnable proExec=新的多服务器线程(s,peds)**
线程th=新线程(proExec)
th.start();}
serverSocket.close();
}
类KKMultiServerThread实现可运行{
私有套接字=空;
公共最终ArrayList peds;
公共多服务器线程(套接字、ArrayList peds){
this.socket=socket;
this.peds=peds;
}
**问题发生在这一行。表示:不能从静态上下文引用非静态变量

已经尝试了所有可能的组合(例如将runnable类放在另一个文件中,并调用函数返回数据结构..IDE不允许我这样做。)

似乎这个问题剩下的唯一可能的解决方案是解析xml文件并将其保存在每个线程的数据结构中……这似乎成本太高,效率不高


请帮助!

您的peds变量不是静态的,因此无法从静态上下文访问它,它需要一个封闭类的对象

最简单的解决方案是使其静止


但是,如果逻辑上每个请求需要一个ArrayList(以便一次处理多个请求)您可能应该为每个请求创建一个新的ArrayList并将其传递给线程。

从主方法中取出所有代码,创建一个名为ServerRunner的新类或其他类。然后调用ServerRunner.Start()然后从那里运行所有代码。

问题是,在构建
KKKmultiServerThread
时,您没有提供
peds
的本地定义。我怀疑您真正想做的是:

while (listening){ 
    Socket s = serverSocket.accept();
    ArrayList<show> peds = getPedsFromSomewhere();
    Runnable proExec = new KKMultiServerThread(s, peds);
    Thread th = new Thread (proExec)
    th.start();
}
在(监听)时{
sockets=serverSocket.accept();
ArrayList peds=getPedsFromSomewhere();
Runnable proExec=新的多服务器线程(s,peds);
线程th=新线程(proExec)
th.start();
}

编译器正在抱怨,因为它能找到的
peds
的唯一定义是在内部类
KKMultiServerThread
中。这突出了在单个类定义中重载特定名称用法的危险。如果将
KKMultiServerThread
拉到它自己的顶级类中,问题就会解决我马上就明白了,因为你不会过度使用
s
peds
peds

可能会重复我很困惑..你的
main()
method和
KKMultiServerThread
类是同一类文件的一部分?另外,如果
KKMultiServerThread
是一个内部类,我可以理解为什么会出现该错误,因为它需要声明为静态。