Отправка объектов назад и вперед между потоками в Java? - PullRequest
5 голосов
/ 02 декабря 2011

У меня несколько потоков-обработчиков клиента, эти потоки должны передать полученный объект в очередь на сервере, а очередь сервера передаст объект другого типа обратно в поток-отправитель. Очередь сервера запускается и продолжает работать при запуске сервера. Я не уверен, какой механизм потоков использовать для потоков обработчика клиента, уведомляющих об отправке объекта. Я не собираюсь использовать сокет или запись в файл.

Ответы [ 6 ]

5 голосов
/ 02 декабря 2011

Если вы хотите сделать фактическую передачу сообщений, взгляните на SynchronusQueue . Каждый поток будет иметь ссылку на очередь и будет ждать, пока один поток не передаст ссылку через очередь.

Это будет потокобезопасно и соответствует вашим требованиям.

Хотя, если вы просто хотите, чтобы потоки читали и записывали общую переменную, вы можете воспользоваться предложением normalocity, хотя его потокобезопасность зависит от того, как вы к нему обращаетесь (через синхронизированный или изменчивый)

4 голосов
/ 02 декабря 2011

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

Например, определите метод, в который вы передаете объект, и сделайте этот метод доступным издругая нить.Объект, который вы хотите передать, просто должен быть доступен из области видимости другого потока.

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

Один из методов обработки объектов и создания объектов результатов - иметь общий массив или LinkedList, который действует какочередь объектов, содержащая объекты для обработки и результирующие объекты этой обработки.Трудно вдаваться в подробности, не вдаваясь в подробности того, что именно вы пытаетесь сделать, но большая часть общего доступа к объектам между потоками сводится либо к вызовам методов между потоками, либо к некоторой общей коллекции / очереди объектов.

2 голосов
/ 02 декабря 2011

Если вы не абсолютно уверены, что это всегда будет только один объект за раз, используйте какую-то очередь.

Если вы уверены, что это всегда будет только один объект одновременно, все равно используйте какую-то очередь. : -)

0 голосов
/ 03 декабря 2011

Подсказка, если вы хотите больше погрузиться в взаимодействие между потоками (или процессами, или системами): Архитектура программного обеспечения, ориентированная на шаблоны, Том 2: Шаблоны для параллельных и сетевых объектов

0 голосов
/ 02 декабря 2011
  • Использовать параллельную очередь из java.util.concurrent. *.

почему?Почти гарантированно обеспечить лучшую общую производительность, чем любая вещь, свернутая вручную.

рекомендация: используйте связанную очередь, и вы получите обратное давление бесплатно.

примечание: глубина очереди определяет ваши общие характеристики задержки: меньшие очереди будут иметь меньшие задержки за счет уменьшения пропускной способности.

  • Использовать семантику Future

почему?Futures предоставляет проверенные и стандартные средства получения асинхронного результата.

рекомендация: создайте простой класс Request и предоставьте метод #getFutureResponse ().Реализация этого метода может использовать различные стратегии сигнализации, такие как блокировка, флаг (с использованием Atomic / CAS) и т. Д.

примечание: использование семантики тайм-аута в Future позволит вам связать поведение сервера с вашимSLA сервера, например #getFutureResponse (sla_timeout_ms).

0 голосов
/ 02 декабря 2011

Просто используйте простое внедрение зависимостей .

MyFirstThread extends Thread{
 public void setData(Object o){...}
}
MySecondThread extends Thread{
   MyFirstThread callback;
   MySecondThread(MyFirstThread callback){this.callback=callback)
}
MyFirstThread t1 = new MyFirstThread();
MySecondThread t2 = new MySecondThread(t1);    
t1.start();
t2.start();

Теперь вы можете сделать callback.setData(...) во второй теме.

Я считаю, что это самый безопасный способ. Другие решения включают использование volatile или какого-то общего объекта, который я считаю излишним.

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

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