2

我只是想知道如何让我的 java 程序继续运行,但始终准备好接受输入。

现在我正在使用缓冲区读取器并在一行中读取,但这会使我的程序停止并等待输入。我希望程序继续运行,但随时准备好接受输入,有没有办法做到这一点?

4

5 回答 5

9

我希望您将不得不研究多线程您的应用程序,以使其按您的意愿工作。

编辑:当然,虽然此功能可以通过纯粹的 CLI 界面来实现,但如果您打算让完整的响应/事件驱动系统以多线程方式运行,您可能最好探索其他选项(即 GUI 选项)。

于 2009-05-14T15:35:03.987 回答
2

这是一个多线程命令行界面应用程序如何工作的快速示例。这将不需要轮询输入,也不需要 GUI 界面来在后台执行任务,同时在控制台中等待用户输入。

在此示例中,aThread在后台运行,可以告诉它在指定的秒数后输出问候语。

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.inScanner.nextInt方法的输入。一旦接受了等待的秒数,后台线程就会被告知等待某个时间,一旦该时间到达,问候语Hello!就会输出到控制台。

于 2009-05-14T16:04:56.367 回答
1

我认为您的程序将不得不偶尔轮询用户输入。

于 2009-05-14T15:35:18.073 回答
1

给它一个漂亮的多线程 GUI 而不是 CLI :)

于 2009-05-14T15:38:47.067 回答
0

我同意詹姆斯的观点,另一种选择是“伪造”连续程序运行。这不适用于所有场景,但您可以在显示用户输入之前设置一个计时器,然后在用户输入内容时再次计算停止和“开始”之间的时间。

使用该时间执行重复的功能一定次数。这仅在您已经在计时器本身上有一些东西时才有用,例如每隔几秒就会不断消耗整数。

一个例子:

你问用户一个问题,但只想给他们 5 秒的时间来回答。当用户回答(点击进入)时,程序将计算他们进入所花费的时间,如果太长,则抛出一条消息,如果在时间限制内抛出另一条。

我只是建议这种方法,因为线程,这是你真正想要进入的,非常先进。

于 2009-05-14T15:46:50.887 回答