Запрограммируйте цикл, который продолжается до тех пор, пока вы не введете что-то в консоль - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать цикл, который выполняет определенный метод при вводе текста в консоль. Я хочу использовать java.util.Scanner, но когда я пытаюсь использовать .hasNext () для проверки внутри if (), а затем .next (), чтобы получить ввод, он ждет, пока я не введу что-то вместо циклического включения.

while(true) {
    main_loop();
}

private void main_loop() {
    do_other_things(); 
    if(sc.hasNext()){
        System.out.println("user entered " + sc.next());
    } else {
        System.out.println("user entered nothing");
    }
}

Как я могу заставить его выводить "пользователь ничего не ввел", пока я не введу что-то, чтобы он выводил "пользователь ввел [...]", а затем продолжает "пользователь ничего не ввел"?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

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

    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    Scanner scanner = new Scanner(System.in);
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (scanner.hasNext()) {
                String st = scanner.next();
                //do something now the user has inputted
                System.out.printf("The user entered a string! (%s)", st);

                //run the runnable to wait again
                executorService.schedule(this, 0, TimeUnit.SECONDS);
            }
        }
    };
    executorService.schedule(runnable, 0, TimeUnit.SECONDS);
}
0 голосов
/ 10 января 2019

Использовать другой поток:

public static void main(String[] args) {
    new Thread(() -> {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            if (scanner.hasNext()) {
                //... user has input
            }
            else {
                //... user does not have input
            }
    }).start();
    doSomethingElse();
}
...