Java 如何在3.5秒后停止并跳过命令?
我想在命令等待输入3.5秒后停止并跳过该命令。我试图通过从开始时间中减去来使用Java 如何在3.5秒后停止并跳过命令?,java,loops,timer,Java,Loops,Timer,我想在命令等待输入3.5秒后停止并跳过该命令。我试图通过从开始时间中减去来使用System.currentTimeMillis(),但是我编写的代码不会跳过输入 食物是table类中的数组列表 public void timer() { startTime = System.currentTimeMillis(); while(false||(System.currentTimeMillis()-startTime)<3500) {
System.currentTimeMillis()
,但是我编写的代码不会跳过输入
食物是table类中的数组列表
public void timer() {
startTime = System.currentTimeMillis();
while(false||(System.currentTimeMillis()-startTime)<3500)
{
correct = input(); //What I want to skip after 3.5 seconds
}
record();
}
您面临的问题之一是,当从控制台读取时,任何
扫描仪
的下一步
方法都无法中断。因此,您必须以不同的方式读取输入,例如使用InputStreamReader
之后,您可以将一个特定任务提交给一个独立于主线程
处理“输入读取”执行的应用程序。您将获得一个可以定义超时的
请注意,此操作仍处于阻塞状态(在两个线程上)
此解决方案在某种程度上基于此
import java.io.*;
导入java.util.concurrent.*;
公开课考试{
静态类ReadInput实现了可调用{
公共整数调用()引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
试一试{
while(br.ready()==false){
睡眠(250);
}
字符串输入=br.readLine();
返回整数.parseInt(输入);
}捕捉(中断异常e){
返回null;
}
}
}
公共静态void main(字符串[]args){
整数输入=空;
ExecutorService ex=Executors.newSingleThreadExecutor();
试一试{
Future=ex.submit(new ReadInput());
输入=future.get(3500,时间单位为毫秒);
}捕获(ExecutionException | InterruptedException | TimeoutException e){
//处理需要处理的异常
}最后{
例如,关闭现在();
}
System.out.println(“完成:+输入”);
}
}
请注意,
ReadInput
中的超时时间应低于主线程中的超时时间
您反复编写的代码要求输入3.5秒;这就是你想要的吗?不,我希望它停止要求输入,并在3.5秒后跳过代码。嘿,我真的很感谢你为帮助我所付出的努力。然而,我是一个新手(刚刚开始AP CS),希望进一步了解这段代码是什么,做什么。是的,我们还没有学习静态(我知道这很奇怪)。比如说,我是创建另一个类来放入第一个代码块,还是在所有代码下面进行?我在学习Eclipse之前就开始了这个项目,所以它是blueJ的,它还能工作吗?很抱歉问你所有这些,但是你能详细说明一下它是如何工作的吗?静态
在这种情况下并不是真正相关的(我只是在创建它时将其用作主方法的旁边)。请随意创建一个公共类(在其自己的文件中)。-我从未使用过blueJ
,但它只是基本的java代码,与任何IDE
都没有真正的关联。我把它放在我的类下,它说这里不允许修改器static。我添加了一个主类(Test
),现在你可以简单地复制它。
public boolean input()
{
Scanner console = new Scanner (System.in);
//I want to skip everything after this after 3.5 seconds.
int num = console.nextInt();
num--;
System.out.println("You selected " + table.food.get(num).toString());
table.food.remove(num);
if (num==choice)
{
return true;
}
return false;
}