Вопрос по java – установить тайм-аут для ввода пользователя

7

Можно ли установить таймер для пользовательского ввода? Подождите 10 секунд - выполните следующую операцию и т. Д. Я имею ввиду например

<code> //wait several seconds{
 String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
 //wait server seconds}
 //next operation and etc.
</code>

Ваш Ответ

2   ответа
5

Не прямо из коробки, нет. Обычно Reader прекращает вызов read () только тогда, когда другой поток закрывает основной поток, или вы достигли конца ввода.

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

По сути, поток чтения должен будет опрашивать метод Reader's ready (), а не блокироваться в read (), когда нечего читать. Если вы поместите эту операцию опроса и ожидания в java.util.concurrent.Future, то вы вызовете метод get () будущего с тайм-аутом.

Эта статья детализируется:http://www.javaspecialists.eu/archive/Issue153.html

13

Немного более простой способ сделать это, чем ответ Бенджамина Кокса, состоит в том, чтобы сделать что-то вроде

int x = 2; // wait 2 seconds at most

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
long startTime = System.currentTimeMillis();
while ((System.currentTimeMillis() - startTime) < x * 1000
        && !in.ready()) {
}

if (in.ready()) {
    System.out.println("You entered: " + in.readLine());
} else {
    System.out.println("You did not enter data");
}

Это, однако, потребляет больше ресурсов, чем его решение.

Error: User Rate Limit ExceededSystem.inError: User Rate Limit ExceededBufferedReader::readLine.
Error: User Rate Limit ExceededSystem.inError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededThread.sleep(100)Error: User Rate Limit Exceeded

Похожие вопросы