我只是想知道如何让我的java程序继续运行,但总是准备接受输入。
现在我正在使用缓冲区读取器并读取一行,但这使我的程序暂停并等待输入。我希望程序继续运行,但是随时准备好接受输入,有没有办法做到这一点?
答案 0 :(得分:9)
我希望你不得不考虑多线程你的应用程序,以便按照你的意愿使用它。
编辑:当然,虽然这个功能可以通过纯粹的CLI界面实现,但如果您打算获得完整的响应,您最好还是可以更好地探索其他选项(即GUI选项)事件驱动的系统以多线程方式运行。
答案 1 :(得分: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
正在运行时,主线程正在等待System.in
通过Scanner.nextInt
方法的输入。一旦接受了等待的秒数,后台线程将被告知等待一段时间,一旦到达该时间,问候语Hello!
就会输出到控制台。
答案 2 :(得分:1)
我认为您的程序偶尔会轮询用户输入。
答案 3 :(得分:1)
给它一个漂亮的多线程GUI而不是CLI:)
答案 4 :(得分:0)
我同意詹姆斯的看法,另一种选择是“假装”连续程序运行。这不适用于所有场景,但您可以在显示用户输入之前设置计时器,然后在用户输入内容时再次计算停止和“开始”之间的时间。
使用该时间执行重复的功能一定次数。这只有在你已经拥有定时器本身的东西时才有用,比如每隔几秒就会有一个不断消耗的整数。
一个例子:
您问用户一个问题,但只想给他们5秒钟的答案。当用户回答(点击输入)时,程序将计算他们输入的时间,如果太长,则抛出一条消息,如果在时间限制内则抛出另一条消息。
我只是建议使用这种方法,因为线程是你真正想要进入的,非常先进。