Как я могу сигнализировать о спящем потоке в Java? - PullRequest
3 голосов
/ 27 февраля 2011

Я пишу пару UDP-клиент-сервер для сетевого класса и столкнулся с проблемой. Это довольно необычное сетевое назначение, поэтому сначала немного о себе:

Цель состоит в том, чтобы создать сервер для реализации push-уведомлений. Ключевым моментом здесь является то, что сервер должен связаться с клиентом по тому адресу, который он видел в последний раз, а также прослушать контрольные пакеты клиента. Поэтому у меня на клиенте запущен поток, периодически отправляющий UDP-пакеты на сервер, который регистрирует их происхождение, когда ему нужно отправить ответ. Этот метод также переходит через NAT, так как отправка обновляет трансляцию адреса.

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

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

Как я могу осуществить это на Java?

P.S .: Если выяснится, что NAT разрешил бы связь через другой порт, то все будет здорово.

Ответы [ 4 ]

3 голосов
/ 27 февраля 2011

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

Но ответ на ваш главный вопрос "Как я могу сигнализировать о спящем потоке в Java" -: Звоните interrupt() в теме.Вам понадобится более сложный механизм, чтобы сообщить , почему он был прерван, но это только начало.interrupt() пробудит sleep() ing или wait() нить с InterruptedException, но я не думаю, что это действительно то, что вы спрашиваете.

Это не разбудит поток, заблокированный при вызове read(), скажем, через сокет.Похоже, вы используете DatagramSocket, и в этом случае у вас есть несколько вариантов:

2 голосов
/ 27 февраля 2011
0 голосов
/ 27 февраля 2011

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

У вас может быть один селектор, наблюдающий и канал UDP, и канал в процессе, просыпаясь от активности любого из них.

На полпути вниз есть введение в селекторы http://java.sun.com/developer/technicalArticles/releases/nio/.См. Также документы API AbstractSelector и его интерфейс .

0 голосов
/ 27 февраля 2011

Как поток «спит»?

Как правило, взаимодействие между потоками вращается вокруг

вызовов wait () и notify ().

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