отправлять сообщения TCP из двух разных потоков

1

У меня есть два потока, которые должны отправлять TCP-сообщения с использованием того же уже установленного соединения. У меня есть объект, позволяющий сказать tcpSender, который я хотел бы использовать из поточных тем. Как я могу создать свое программное обеспечение, чтобы у меня не было проблем с concurrency и потерянных сообщений?

Спасибо!

Теги:
design-patterns
tcp

3 ответа

2
Лучший ответ

Вы можете моделировать это как производитель/потребитель, где каждый поток вставляет сообщения в TCPSender, когда они готовы, а TCPSender поддерживает очередь сообщений FIFO. Вставки в очередь будут заблокированы (в пределах TCPSender) и обработаны в порядке.

Будет существовать другой поток, который потребляет сообщения, когда очередь не будет пустой блокировкой каждый раз, когда сообщение удаляется из очереди.

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

  • 0
    Я использовал этот метод некоторое время назад. Это сработало очень хорошо.
2

Вы можете создать Semaphore, который вы acquire перед каждой отправкой и release после каждой отправки. Это обеспечит доступ к ресурсам одним потоком за раз.

  • 0
    +1 да Просто имейте в виду, что операция отправки может блокироваться в течение сколь угодно длительного времени (если, например, другой конец соединения перестает принимать данные и срабатывает управление потоком TCP), так что вы могли бы долго ждать acquire семафора.
  • 0
    Это излишне сложно. Семафор в Java обычно требуется, только если вы хотите ограничить определенное количество одновременных обращений. Если доступ к ресурсу разрешен только одному потоку, синхронизированный блок гораздо проще в использовании.
Показать ещё 4 комментария
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню