Как я могу эмулировать не блокирующий ввод/вывод на Java, используя потоки

StackOverflow https://stackoverflow.com/questions/3897755

  •  29-09-2019
  •  | 
  •  

Вопрос

Я пишу простое приложение с участием сервера и многих клиентов в момент времени. Я должен использовать DatagramSocket. Приложение - это простой обмен сообщениями через консоли, как в чате. Но обе операции в. Может ли любое тело сказать мне, как я могу сделать это без nio

Это было полезно?

Решение

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

Затем давайте рассмотрим влияние этого решения на количество потоков в вашем приложении:

  • Если у вас есть только несколько клиентов на сервер, то наличие потоков ввода-вывода на каждого клиента не проблема.
  • Если у вас есть много клиентов на сервер, то вы должны принять тот факт, что некоторые из их запросов будут обработаны не сразу, но только тогда Worker Thread станет доступной. Вы можете попытаться породить столько потоков ввода -вывода, сколько и клиентов, но есть ограничения на количество потоков, которое может иметь отдельный экземпляр JVM. Точные числа зависят от размера кучи, доступной для вашего JVM, и о том, является ли ваша архитектура 32 -битная или 64 -битная, см. здесь.

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

Другие советы

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

Вы можете легко выбрать данные с несколькими клиентами с несколькими клиентами, используя Datagramsocket и рабочую очередь, например java.util.concurrent.threadpoolexecuture.

Идея состоит в том, что у вас есть один ресивер, читая нить, чтение розетки, и каждый дейтаграмма получен, завернутый в объект «GetyDatagram» и упал на рабочую очередь. Работает-очередь имеет пул резьбы, нити которого следят и обрабатывают каждый пакет; Если пакет требует ответа, нить отправляет ответ (блокировка), прежде чем блокировать, чтобы нанести еще одну полученную программу.

Чтобы отправить данные асинхронно, вы просто размещаете объект «SendDatagram» в рабочую сторону, который представляет Datagrampacket для отправки.

Примечание, вы будете использовать datagram.receive (datagrampacket) и datagram.send (datagrampacket).

Вы можете сделать это, выполняя блокирующие операции в отдельных потоках, используя вручную породистый нить или лучший пул резьбы (http://www.ibm.com/developerworks/library/j-jtp0730.html)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top