Java: как сравнивать объекты в разных потоках - PullRequest
0 голосов
/ 01 июля 2011

У меня есть сервер прослушивания данных от клиентов.Как только клиент отправляет данные, он попадает в поток.Таким образом, каждый поток имеет данные.revFeaturePoints - это данные, которые сервер получает от клиентов.

Каждый revFeaturePoints имеет массив с плавающей точкой, я хочу вычислить евклидово расстояние между различными revFeaturePoints в разных потоках?

Я не знаю, как можноразрешить одному потоку обращаться к другому revFeaturePoints в других потоках?

Вот код:

public class MyServer {

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

    //bind a serverSocket to the port and listen
    try{
        serverSocket = new ServerSocket(8888);
        System.out.println("Listening: 8888");
    }catch(IOException e){
        e.printStackTrace();
    }

    while(true)
        new MyServerThread(serverSocket.accept()).start();
}   
}

public class MyServerThread  extends Thread{
//Create a socket for each client
private Socket socket = null;
private ObjectInputStream dataInputStream = null;
private ObjectOutputStream dataOutputStream = null;
private ArrayList<FeaturePointList> revFeaturePoints = null;

//constructor
public MyServerThread(Socket socket){
    super("MyServerThread");
    this.socket = socket;
}

@SuppressWarnings("unchecked")
public void run(){
    try{            
        dataOutputStream = new ObjectOutputStream(socket.getOutputStream());
        dataInputStream = new ObjectInputStream(socket.getInputStream());
        System.out.println("ip: "+ socket.getInetAddress());
        revFeaturePoints = (ArrayList<FeaturePointList>) dataInputStream.readObject();          

    }catch(IOException e){
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    finally{
        if(socket!=null){
            try{
                socket.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
        if(dataInputStream!=null){
            try{
                dataInputStream.close();
            }catch(IOException e){
                e.printStackTrace();
            }               
        }
        if(dataOutputStream!=null){
            try{
                dataOutputStream.close();
            }catch(IOException e){
                e.printStackTrace();
            }               
        }

    }
}

}

Ответы [ 5 ]

1 голос
/ 01 июля 2011

[на самом деле комментарий, но он не подходит;)]

Ответ maasg в общем смысле вполне корректен, но я полагаю, что вы сейчас смотрите на трудности проектирования, а не на реализацию многопоточной реализации Java.

Ваш сервер (как есть) запускает одноразовый поток при каждом запросе на подключение, и этот поток просто читает один объект с клиента и затем закрывает соединение.Переданный объект помещается в объектный объект (поток сервера) (который должным образом собирает мусор после выхода из run ()).

Это совершенно неясно - и, таким образом, создается впечатление, что это проблема проектирования.- как вы определяете, какие 2 потока сравнивать, или в этом отношении, что гарантирует, что у вас будет (всегда) 2 одновременных потока для начала.

Логически у вас явно есть какая-то специфическая для домена связь между серверным потоком и каким-то значимым вопросом в вашем домене.Эти отношения должны быть воплощены в коде, но сначала мы должны понять, что это за различие и отношение.

1 голос
/ 01 июля 2011

Простым способом было бы поместить синхронизированный метод в MyServerThread, который возвращает данные.

Другим способом сделать это было бы использование BlockingQueue и помещение результата данных в очередь и получение результатов из этого в качестве шаблона производитель-потребитель. Смотрите здесь , чтобы узнать, как это сделать.

1 голос
/ 01 июля 2011

Вы можете делиться данными между потоками, используя общую структуру и правильную синхронизацию. Например, у вас может быть ConcurrentHashMap<'threadname', data> in MyServerThread, где каждый поток помещает свои данные и ищет данные в других потоках.

Тем не менее, вы должны оценить свою архитектуру. Если N потоков должны проверить, что другие N-1 потоки делают с данными, вы готовите рецепт для снижения производительности. Вероятно, вы хотели бы создать несколько уровней в вашей архитектуре, где несколько ServerThreads собирают запрос и размещают их в параллельной общей структуре (например, очереди). Затем другой набор работников сравнивает и обрабатывает данные и производит результаты в совместной системе. Взгляните на шаблон производитель-потребитель .

1 голос
/ 01 июля 2011

Если ваш класс MyServerThread хранит данные в поле, вы можете получить доступ к этому полю из нескольких экземпляров MyServerThread.

0 голосов
/ 01 июля 2011

Объекты не «в разных потоках».Объекты являются членами других различных объектов, на которые обычно ссылаются через методы get.Забудьте о проблеме потока полностью, это не имеет значения.Вы просто хотите сравнить элемент объекта A с элементом объекта B. Это просто обычный бизнес.

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