Как разорвать петлю, если действие застывает на долгое время

На самом деле, я пишу на 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); 
Другие вопросы по тегам