Как выполнить многопоточность и программирование сокетов при отправке ArrayList в поток в Java - PullRequest
0 голосов
/ 27 июня 2011

По сути, мне нужно проанализировать 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;
        }

** Проблема возникает в этой строке.Говорит: на нестатическую переменную нельзя ссылаться из статического контекста.

перепробовал все возможные комбинации (например, поместил класс runnable в другой файл и вызвал функцию для возврата структуры данных. Среда IDE не позволяет мне делать это.)

Похоже, что единственное возможное оставшееся решение этой проблемы - это анализ файла xml и сохранение его в структуре данных ДЛЯ КАЖДОЙ РЕЗЬБЫ ... это кажется слишком дорогостоящим, чтобы быть эффективным.

пожалуйста, помогите!

Ответы [ 3 ]

1 голос
/ 27 июня 2011

Ваша переменная peds не является статической, поэтому к ней нельзя получить доступ из статического контекста, для нее нужен объект включающего класса.

Самое простое решение - сделать его статичным.

Однако, если вам логически понадобится один ArrayList для каждого запроса (для обработки более одного запроса за раз), вам, вероятно, следует создать новый ArrayList для каждого запроса и передать его в поток.

0 голосов
/ 05 июня 2015

Проблема в том, что вы не предоставляете локальное определение peds при создании KKMultiServerThread.Я подозреваю, что вы действительно хотите сделать что-то вроде следующего:

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 в его собственный класс верхнего уровня, проблема станет очевидной, поскольку у вас не будет перегруженного использования s и peds.

0 голосов
/ 27 июня 2011

Извлеките весь ваш код из основного метода и создайте новый класс с именем ServerRunner или что-то в этом роде.Затем вызовите ServerRunner.Start () и выполните весь этот код оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...