Как ограничить время на ввод?

Хочу добиться того, чтобы программа перестала ждать ввода юзера, если он ничего не ввёл за 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 + "...");
    }
→ Ссылка