【问题标题】:How do I perform Multithreading and Socket programming while sending an ArrayList to the thread in Java如何在将 ArrayList 发送到 Java 中的线程时执行多线程和套接字编程
【发布时间】:2011-06-27 06:45:21
【问题描述】:

基本上,我需要解析一个 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;
        }

** 问题出现在这一行。说 :non-static 变量不能从静态上下文中引用。

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

似乎这个问题唯一可能的剩余解决方案是解析 xml 文件并将其保存在每个线程的数据结构中......这似乎成本太高而无法高效。

请帮忙!

【问题讨论】:

标签: java multithreading sockets data-structures


【解决方案1】:

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

最简单的解决方案是使其成为静态。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      问题是您在构建KKMultiServerThread 时没有提供peds 的本地定义。我怀疑您真正想要做的事情如下:

      while (listening){ 
          Socket s = serverSocket.accept();
          ArrayList<show> peds = getPedsFromSomewhere();
          Runnable proExec = new KKMultiServerThread(s, peds);
          Thread th = new Thread (proExec)
          th.start();
      }
      

      编译器抱怨,因为它可以找到的peds 的唯一定义是在内部类KKMultiServerThread 中。这突出了在单个类定义中重载特定名称的使用的危险。如果您将KKMultiServerThread 拉到它自己的顶级类中,那么问题将立即变得明显,因为您不会重载使用speds

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        • 2020-03-28
        • 2016-07-23
        • 2012-12-08
        • 2014-08-05
        • 2013-01-24
        • 2017-09-22
        相关资源
        最近更新 更多