【问题标题】:Taking input in Java without program hanging?在没有程序挂起的情况下用 Java 输入?
【发布时间】:2009-05-14 15:33:07
【问题描述】:

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

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

【问题讨论】:

    标签: java input continuous


    【解决方案1】:

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

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

    【讨论】:

    • 我发现线程有点复杂,不过不要气馁,它绝对是复杂的。如果您愿意,请尝试其他方式。
    • 关于 CLI 接口的评论对我来说似乎是一条红鲱鱼。完全有可能拥有一个具有“CLI 界面”的程序,该程序能够在处理用户输入的同时仍在后台执行其他操作。以程序“top”为例。
    • 你说的很对,劳伦斯,然而,我已经假设(并将在我上面的帖子中通过编辑澄清)用户的目标是通过以下方式建立一个更加事件驱动的响应系统这个问题是措辞。我会更新我的“编辑”。
    【解决方案2】:

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

    在此示例中,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 运行时,主线程正在通过Scanner.nextInt 方法等待来自System.in 的输入。一旦等待的秒数被接受,后台线程就会被告知等待某个时间,一旦该时间到达,问候语Hello! 就会输出到控制台。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          利用这段时间重复执行一定次数的功能。仅当您已经在计时器上设置了某些内容时,这才有用,例如每隔几秒就会不断消耗整数。

          一个例子:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-16
            • 1970-01-01
            • 2011-05-24
            • 2012-05-15
            • 2012-11-13
            • 2010-10-28
            • 1970-01-01
            相关资源
            最近更新 更多