Остановка индикатора выполнения консоли Java

Я ищу способ остановить продвижение следующего бара:

private static void cancellaaaaaaaaable() throws InterruptedException {
    System.out.println("Cancellaaaaaaable!");
    System.out.print(ANSI_RED);
    for(int i = 0; i < 79; i++){
        // Something that allows user input/interaction capable to stop the progressbar
        System.out.print("█");
        TimeUnit.MILLISECONDS.sleep(500);
    }
    System.out.print(ANSI_RESET);
}

Когда индикатор выполнения запускается, у пользователя должно быть около 40 секунд, чтобы решить остановить и отменить индикатор выполнения.

введите здесь описание изображения

Есть ли способ сделать это? Отлично подходит любой ввод с клавиатуры, кроме тех, которые жестоко останавливают процесс.


person shogitai    schedule 15.05.2017    source источник
comment
Вы хотите получить пользовательский ввод из цикла for и проверить его? Если он равен некоторому значению, вы хотите продолжить или остановить его? Правильно ли это понимание?   -  person Aritra Chatterjee    schedule 15.05.2017


Ответы (2)


Вот решение, вдохновленное как читать из стандартного ввода без блокировки?

Идея состоит в том, чтобы проверить, есть ли что читать из System.in .

Обратите внимание, что это работает только в том случае, если ввод подтвержден (например, с помощью клавиши Enter), но работает даже пустой ввод (клавиша Enter нажата напрямую), поэтому вы можете добавить некоторые Сообщение «Нажмите Enter для отмены».

private static void cancellaaaaaaaaable() throws InterruptedException {
    System.out.println("Cancellaaaaaaable!");
    System.out.print(ANSI_RED);

    InputStreamReader inStream = new InputStreamReader(System.in);
    BufferedReader bufferedReader = new BufferedReader(inStream);
    for (int i = 0; i < 79; i++) {

        System.out.print("█");
        TimeUnit.MILLISECONDS.sleep(500);

        // Something that allows user input/interaction capable to stop the progressbar
        try {
            if (bufferedReader.ready()) {
                break;
            }
        } catch (IOException e) {

            e.printStackTrace();
        }
    }
    System.out.print(ANSI_RESET);
}

Обратите внимание, что вы можете выполнять более сложные консольные действия, например, с Java Curses Library.

person Arnaud    schedule 15.05.2017

определить вызываемый объект:

class MyCallable implements Callable<Boolean> {

    @Override
    public Boolean call() throws Exception {
        for (int i = 0; i <= 99; i++) {
            System.out.print("█");
            try {
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (InterruptedException e) {
                e.getStackTrace();
                return false;
            }
        }
        return true;
    }
}

затем FutureTask и ExecutroService:

public static void main(String[] args) throws InterruptedException {
    System.out.println("Cancellaaaaaaable!");
    MyCallable callable1 = new MyCallable();
    FutureTask<Boolean> futureTask1 = new FutureTask<>(callable1);

    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.execute(futureTask1);
    TimeUnit.MILLISECONDS.sleep(500);
    futureTask1.cancel(true);
    System.out.println("\nDone");

}

и отмените это всякий раз, когда вам это нужно:

futureTask1.cancel(true);
person ΦXocę 웃 Пepeúpa ツ    schedule 15.05.2017