Принимать входные данные в Java без зависания программы? - PullRequest
2 голосов
/ 14 мая 2009

Мне было просто интересно, как я мог бы продолжить выполнение моей java-программы, но всегда был готов принять данные.

Прямо сейчас я использую буферный ридер и читаю в строке, но это заставляет мою программу остановиться и ждать ввода. Я хочу, чтобы программа продолжала работать, но будьте готовы принимать вводные данные, когда это необходимо, есть ли способ сделать это?

Ответы [ 5 ]

9 голосов
/ 14 мая 2009

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

Редактировать : Конечно, хотя эта функциональность может быть реализована с помощью чисто CLI-интерфейса, вам, вероятно, было бы лучше изучить другие параметры (например, параметры GUI), если вы намерены получить полный ответ / событие система, работающая в многопоточном режиме.

2 голосов
/ 14 мая 2009

Вот краткий пример того, как может работать многопоточное приложение интерфейса командной строки. Это не потребует опроса для ввода или интерфейса с графическим интерфейсом для выполнения задач в фоновом режиме при ожидании ввода от пользователя в консоли.

В этом примере Thread работает в фоновом режиме, и ему можно вывести приветствие через указанное количество секунд.

public class CommandLineMultiThread
{
    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);

        // Makes and runs the background thread.
        MyThread myThread = new MyThread();
        Thread t = new Thread(myThread);
        t.start();

        // Get the number of seconds to wait from the console.
        // Exit when "0" is entered.
        int waitDuration;
        do
        {
            waitDuration = s.nextInt();
            myThread.setGreetIn(waitDuration);

        } while (waitDuration != 0);

        myThread.quit();
    }

    static class MyThread implements Runnable
    {
        boolean running = true;                // Boolean to keep thread alive.
        long greetingTime = Long.MAX_VALUE;    // Time to greet at.

        public void setGreetIn(int i)
        {
            greetingTime = System.currentTimeMillis() + (i * 1000);
        }

        public void quit()
        {
            running = false;
        }

        public void run()
        {
            while (running)
            {
                if (System.currentTimeMillis() > greetingTime)
                {
                    System.out.println("Hello!");
                    greetingTime = Long.MAX_VALUE;
                }

                try
                {
                    Thread.sleep(100);
                }
                catch (InterruptedException e) {}
            }
        }
    }
}

Класс Scanner может использоваться для приема ввода пользователя из интерфейса командной строки путем маршрутизации ввода от объекта System.in.

Затем, пока работает фоновый поток myThread, основной поток ожидает ввода от System.in с помощью метода Scanner.nextInt. После того, как секунды ожидания приняты, фоновому потоку предписано подождать до определенного времени, и как только это время наступит, на консоль выводится приветствие Hello!.

1 голос
/ 14 мая 2009

Дайте ему хороший многопоточный графический интерфейс вместо CLI:)

1 голос
/ 14 мая 2009

Я думаю, что вашей программе придется время от времени опрашивать пользовательский ввод.

0 голосов
/ 14 мая 2009

Я согласен с Джеймсом, другой альтернативой является «фальсификация» непрерывной работы программы. Это не будет работать со всеми сценариями, но вы можете установить таймер прямо перед отображением пользовательского ввода, а затем вычислить время между остановкой и «запуском» снова, когда пользователь что-то вводит.

Используйте это время для выполнения повторной функции определенное количество раз. Это полезно только в том случае, если у вас уже есть что-то в самом таймере, например, непрерывное сливающееся целое число каждые несколько секунд.

Пример:

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

Я только предлагаю этот метод, потому что многопоточность, в которую вы действительно хотите попасть, довольно продвинута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...