Как ограничить время на ввод?
Хочу добиться того, чтобы программа перестала ждать ввода юзера, если он ничего не ввёл за 3 секунды, и код после считывания scanner начал исполняться. Но метод scanner.close() почему-то не работает здесь. Как исправить/реализовать иначе?
import java.util.Scanner;
class Countdown extends Thread{
public void run(){
for(int i = 1; i<4; i++){
if(Timer.marker == 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(i + "...");
}
}
Timer.scanner.close();
}
}
public class Timer {
static Countdown timer;
static int marker = 0;
static Scanner scanner;
public static void main(String[] args) {
timer = new Countdown();
System.out.println("Введите что-то");
timer.start();
scanner = new Scanner(System.in);
marker = scanner.nextInt();
}
}
Ответы (1 шт):
Автор решения: Serodv
→ Ссылка
Scanner довольно специфическая штука и криво работает в многопоточности. По сути всю логику его работы надо выносить в другой поток и глушить этот поток после таймаута, но не факт что этот костыль что-то не повредит. Я бы предложил однопоточное решение с анализом количества введённых байтов в InputStream через определённые интервалы.
Integer marker = null;
scanner = new Scanner(System.in);
for (int i = 1; i < 4; i++) {
try {
Thread.sleep(1000);
if (System.in.available() > 0) {
marker = scanner.nextInt();
scanner.nextLine();
break;
}
System.out.println("time is off");
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(i + "...");
}