Как разорвать петлю, если действие застывает на долгое время
На самом деле, я пишу на Java (если это большое дело, и у java есть особые методы для решения моей проблемы, если честно, я не знаю) клиента протокола IRC, и у меня немного не хватает знаний. У меня есть строка, где я читаю строку с IRC-сервера. Эта строка:
line = reader.readLine ();
Работает нормально, я использую эту строку в цикле, но приложение останавливается на этой строке, если сервер ничего не отправляет. У меня вопрос, как я могу разорвать мой цикл, если, например, сервер ничего не отправляет в течение 10 секунд?
Я пытался сделать это
do {
start = System.currentTimeMillis();
line = reader.readLine();
... //doing other actions
} while ((System.currentTimeMillis() - start) < 10*1000);
И это работает только тогда, когда я получаю следующий ответ от сервера... Я не могу разорвать цикл после 10 секунд ожидания, с моим методом он будет ждать вечно, если сервер ничего не отправляет. Это моя проблема, извините, если слишком много ошибок или бесполезного текста, это мой первый вопрос здесь:)
2 ответа
Используйте Socket.setSoTimeOut. Вы можете иметь SocketTimeoutException
после тайм-аута.
Просто используйте многопоточность Java.
Процесс ожидания и чтения вашего приложения должен выполняться отдельным потоком, который вы должны явно создать.
Другой поток должен обрабатывать пользовательский интерфейс приложения.
Таким образом, процесс ожидания и чтения больше не будет останавливать приложение.
Класс Thread - хорошее начало.
Например, вы можете сделать это, чтобы создать и запустить поток:
Thread thread = new Thread(){
public void run() {
do {
start = System.currentTimeMillis();
line = reader.readLine();
... //doing other actions
} while ((System.currentTimeMillis() - start) < 10*1000);
};
};
thread.start();
Редактировать после комментариев.
Вы могли бы использовать setSoTimeout()
как предложил StinePike, но этого будет недостаточно, так как вы должны сбросить тайм-аут на 0
(это означает бесконечность) или любое значение, желательное для вас, когда операция, требующая тайм-аута, была прервана.
В противном случае тайм-аут также будет применяться к другим чтениям, которые не хотят этот ограниченный тайм-аут.
do {
start = System.currentTimeMillis();
// you set the timeout for reading to 10 second for each reading
socket.setSoTimeout(10*1000);
try{
line = reader.readLine();
... //doing other actions
}
catch (SocketException e){
// processing if the timeout occurs and break
break;
}
} while ((System.currentTimeMillis() - start) < 10*1000);
// you reinit the timeout for reading to infinite or any value desirable for you
socket.setSoTimeout(0);