2013-12-19 5 views
1

В приложении многопоточной я есть один поток с:Разрывная из UDP сокет получить метод

datagramSocket.receive(packet); 

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

Как я могу это достичь?

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

Любой помощь?

+0

Вы можете установить тайм-аут в 'DatagramSocket' или вы можете выдать прерывание в «Thread». –

+1

Это неплохая идея - это лучше, чем расточительные решения с тайм-аутом с задержкой, которые вы получите. Другое решение без потерь, без задержки - установить флаг «завершать» volatile и отправить поток UDP на пустую дейтаграмму, поэтому возвращать вызов receive(), чтобы он мог проверить флаг и завершить его. –

+0

..или даже отправить «датированную» датаграмму в любой протокол сообщений, который вы используете. –

ответ

1

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

Альтернативой является ввод кода внутри цикла, который проверяет некоторые volatile флаг (как это, вероятно, уже) и настройка тайм-аут:

while (on) { 
    //... 
    datagramSocket.setSoTimeout(5000); 
    datagramSocket.receive(packet); 
    //... 
} 
+0

Код почти такой же, как вы ввели, с той разницей, что ** SoTimeout ** установлен на 0. Я хотел, чтобы сокет всегда открывался. В вашем случае он открывается только на 5 секунд. проблема в том, что, когда я даже устанавливаю переменную ** on ** в false, она не останавливает поток, поскольку он ждет ** методом ** получения **. –

+0

@Pisek либо вы выставляете флаг, либо устанавливаете тайм-аут, либо выставляете реализацию (сокет и/или поток). – Raffaele

+0

@Pisek. Сокет открывается при его создании и закрывается при его закрытии. Сокет * принимает * в течение пяти секунд здесь. Ваше возражение не имеет смысла. – EJP

Смежные вопросы