Как я могу эмулировать неблокирующий ввод / вывод в Java с помощью потоков - PullRequest
1 голос
/ 10 октября 2010

я пишу простое приложение, вовлекающее сервер и множество клиентов одновременно.Я должен использовать DataGramSocket.Приложение представляет собой простой обмен сообщениями через консоль, как в чате.но обе операции in.readLine () и ds.receive () блокируют, и помещение их в отдельные потоки не помогло, поскольку блокировка ввода-вывода также заблокирует поток.может ли любое тело сказать мне, как я могу сделать это без nio

Ответы [ 3 ]

1 голос
/ 10 октября 2010

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

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

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

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

0 голосов
/ 10 октября 2010

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

0 голосов
/ 10 октября 2010

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

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

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

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

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

...