当前位置: 首页 > 知识库问答 >
问题:

为用户输入设置超时

穆子琪
2023-03-14

可以为用户输入设置计时器吗?等待10秒钟-进行下一步操作等。我的意思是例如

 //wait several seconds{
 String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
 //wait server seconds}
 //next operation and etc.

共有3个答案

翟俊茂
2023-03-14
 BufferedReader inputInt = new BufferedReader(new InputStreamReader(System.in));
 Robot enterKey = new Robot();
 TimerTask task = new TimerTask() {
   public void run() {
                      enterKey.keyPress(KeyEvent.VK_ENTER);
                     }
 };

 Timer timer = new Timer();
 timer.schedule(task, 30 * 1000);
 userInputanswer = inputInt.read();
 timer.cancel();
上官扬
2023-03-14

不是开箱即用的。通常情况下,只有当另一个线程关闭底层流或您到达输入的末尾时,Reader才会中断read()调用。

由于 read() 并不是那么容易中断,这就成了一个并发编程问题。知道超时的线程需要能够中断尝试读取输入的线程。

本质上,读取线程必须轮询Reader的ready()方法,而不是在没有可读内容时被锁定在read()中。如果您将此轮询和等待操作包装在java.util.concurrent.Future中,那么您将调用Future的get()方法并带有超时。

本文将详细介绍:http://www.javaspecialists.eu/archive/Issue153.html

仲孙毅
2023-03-14

比本杰明·考克斯的答案更简单的方法是做这样的事情。

int x = 2; // wait 2 seconds at most

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
long startTime = System.currentTimeMillis();
while ((System.currentTimeMillis() - startTime) < x * 1000
        && !in.ready()) {
}

if (in.ready()) {
    System.out.println("You entered: " + in.readLine());
} else {
    System.out.println("You did not enter data");
}

然而,这将比他的解决方案消耗更多的资源。

 类似资料:
  • 问题内容: 可以为用户输入设置计时器吗?等待10秒-进行下一个操作等。例如 问题答案: 不是开箱即用,不。通常,只有当另一个线程关闭基础流或到达输入的末尾时,Reader才会中断read()调用。 由于read()并非具有所有可中断性,因此这成为并发编程问题。知道超时的线程将需要能够中断正在尝试读取输入的线程。 本质上,读取线程将必须轮询Reader的ready()方法,而不是在没有要读取的内容时

  • 问题内容: 我正在使用python,想知道是否可以向用户询问变量的名称,然后使用该名称创建变量。例如: 我知道可以使用字典来完成,但是我想知道是否可以在不创建其他对象的情况下进行。我正在使用python3。谢谢。 问题答案: 您可以使用通过调用返回的字典: 如果您不希望将其定义为全局变量,则可以使用:

  • 我刚开始编程,但仍然在黑暗中蹒跚前行,也许有人能帮我一把?我正在用类Person及其两个子类Student和Employee创建一个程序,询问用户要创建哪个对象,并让他们输入一些信息。 我有一个具有默认构造函数的类Person: 我想为这些变量创建一个getter,以便从其他类访问它们,但它说它们“无法解析为变量”。我想这是因为扫描仪的输入,但我不确定要做什么更改。感谢您的帮助!

  • 我试图用这个功能构建一个命令行界面:如果用户插入一个输入(在本例中是一个整数)需要15秒以上的时间,该函数会做出一个默认选择(0)。下面的代码是我到目前为止写的,它工作正常。 问题是我想添加一个新功能:如果用户写错了数字( 然而,当控制台打印消息时,计时器应该仍然运行,并在15秒后结束此循环,以防用户继续插入错误的数字。如果用户最终得到一个正确的数字,它应该立即打破循环。 这是我的代码,但我对如何

  • ANR堆栈: Java代码:dEmptyOperation类扩展自AsyncTask。refreshList方法包括一个volley post请求

  • 通过RGB值设置输入线的颜色。关于连接线定义,请参考这里: 连接线。 默认的输入线颜色是 0x154492: // 颜色的参数可以是字符串 "#00FF00" 或者是十六进制数值 0x00FF00 controller.setImportColor("#00FF00"); //controller.setImportColor(0x00FF00);