用Java输入而不挂起程序?

用Java输入而不挂起程序?,java,input,continuous,Java,Input,Continuous,我只是想知道如何让我的java程序继续运行,但始终准备好接受输入 现在我正在使用一个bufferreader并在一行中读取,但这会使我的程序停止并等待输入。我希望程序继续运行,但随时准备在需要时接受输入,有没有办法做到这一点?我希望您必须研究应用程序的多线程处理,以使其按您的意愿工作 编辑:当然,虽然此功能可以通过纯CLI界面实现,但您最好还是探索其他选项(即GUI选项)如果你想让一个完整的响应/事件驱动系统以多线程方式运行。我认为你的程序将不得不偶尔轮询用户输入。给它一个漂亮的多线程GUI,而

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


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

我希望您必须研究应用程序的多线程处理,以使其按您的意愿工作


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

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

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

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

使用该时间执行一定次数的重复功能。这只有在计时器本身已经有了一些东西的情况下才有用,比如每隔几秒钟就有一个不断消耗的整数

例如:

您向用户提问,但只想给他们5秒钟的时间回答。当用户回答(点击enter)时,程序将计算他们输入所用的时间,如果太长,抛出一条消息,如果在时间限制下抛出另一条消息


我之所以建议使用这种方法,是因为您真正想要了解的线程技术非常先进。

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

在本例中,一个
线程正在后台运行,可以告诉它在指定的秒数后输出问候语

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) {}
            }
        }
    }
}
通过路由来自对象的输入,该类可用于从命令行界面接受用户输入


然后,当后台线程
myThread
运行时,主线程正在等待通过方法从
System.in
输入。一旦等待的秒数被接受,后台线程就会被告知等待到某个时间,并且一旦该时间到达,问候语
Hello被输出到控制台。

我发现线程有点复杂,但不要因此而气馁,它肯定很复杂。如果需要的话,请尝试一下其他方法。有关CLI接口的评论对我来说似乎是一种误导。完全可能有一个带有“CLI界面”的程序,该程序能够在处理用户输入的同时仍在后台执行其他操作。以“top”程序为例,劳伦斯,你说得很对,但是,我已经假设(并将在我上面的帖子中通过编辑澄清)用户的目标是通过问题的措辞建立一个更为事件驱动的响应系统。我将更新我的“编辑”。