Java 在特定时间内接收输入

Java 在特定时间内接收输入,java,Java,我正在编写一个测试系统,我想做的就是计算用户在这个问题上花费了多少秒。i、 我打印问题(标准System.out.println),然后等待5秒钟,如果在这5秒钟内用户回答了(通过标准输入),我想保留这个值 如果用户在5秒内未提供答案,则必须跳过此问题并继续 问题是我正在通过Scannerobject读取用户答案,我想像.nextInt()中的in这样的东西是无法控制的 我怎样才能解决这个问题?这是我的代码片段,没有这个功能,你能给我一些提示吗 public void start() {

我正在编写一个测试系统,我想做的就是计算用户在这个问题上花费了多少秒。i、 我打印问题(标准System.out.println),然后等待5秒钟,如果在这5秒钟内用户回答了(通过标准输入),我想保留这个值

如果用户在5秒内未提供答案,则必须跳过此问题并继续

问题是我正在通过
Scanner
object读取用户答案,我想像.nextInt()中的
in
这样的东西是无法控制的

我怎样才能解决这个问题?这是我的代码片段,没有这个功能,你能给我一些提示吗

    public void start() {
    questions.prepareQuestions(numQuestions);
    Scanner in=new Scanner(System.in);
    boolean playerIsRight=false,botIsRight=false;
    int playerScore=0,botScore=0;
    for (int i = 0; i < numQuestions; i++) {
        questions.askQuestion(i);
        System.out.print("Your answer(number): ");
        playerIsRight=questions.checkAnswer(i,in.nextInt()-1); //in.nextInt() contains the answer
        botIsRight=botAnswersCorrectly(i + 1);
        if(playerIsRight){ playerScore++; System.out.println("Correct!");}
        else System.out.println("Incorrect!");
        if(botIsRight) botScore++;
        System.out.print("\n");
    }
    if(botScore>playerScore) System.out.println("Machine won! Hail to the almighty transistors!");
    else if(playerScore>botScore) System.out.println("Human won! Hail to the power of nature!");
    else System.out.println("Tie. No one ever wins. No one finally loses.");
}
public void start(){
问题。准备问题(数量);
扫描仪输入=新扫描仪(系统输入);
布尔playerIsRight=false,botIsRight=false;
int playerScore=0,botScore=0;
for(int i=0;iplayerScore)System.out.println(“机器赢了!向全能的晶体管致敬!”);
否则如果(playerScore>botScore)System.out.println(“人类赢了!向大自然的力量致敬!”);
else System.out.println(“平局,没有人赢,没有人最终输。”);
}

在这种情况下,我将使用两个线程。主线程编写问题,等待答案,并记录分数。子线程读取标准输入并将答案发送到主线程,可能是通过

通过使用阻塞队列上的
poll()
方法,主线程可以等待五秒钟以获得答案:

…
BlockingQueue<Integer> answers = new SynchronousQueue();
Thread t = new ReaderThread(answers);
t.start();
for (int i = 0; i < numQuestions; ++i) {
  questions.askQuestion(i);
  System.out.print("Your answer (number): ");
  Integer answer = answers.poll(5, TimeUnit.SECONDS);
  playerIsRight = (answer != null) && questions.checkAnswer(i, answer - 1); 
  …
}
t.interrupt();

系统上使用。在
中,
扫描器
将阻塞,直到用户按下
输入
,因此当主线程超时并转到下一个问题时,用户可能已经输入了一些文本,但尚未按下
输入
。用户必须删除其待处理条目,并为新问题输入新答案。我不知道有什么干净的方法可以避免这种尴尬,因为没有可靠的方法来中断
nextInt()
调用。

在这种情况下,我将使用两个线程。主线程编写问题,等待答案,并记录分数。子线程读取标准输入并将答案发送到主线程,可能是通过

通过使用阻塞队列上的
poll()
方法,主线程可以等待五秒钟以获得答案:

…
BlockingQueue<Integer> answers = new SynchronousQueue();
Thread t = new ReaderThread(answers);
t.start();
for (int i = 0; i < numQuestions; ++i) {
  questions.askQuestion(i);
  System.out.print("Your answer (number): ");
  Integer answer = answers.poll(5, TimeUnit.SECONDS);
  playerIsRight = (answer != null) && questions.checkAnswer(i, answer - 1); 
  …
}
t.interrupt();

系统上使用。在
中,
扫描器
将阻塞,直到用户按下
输入
,因此当主线程超时并转到下一个问题时,用户可能已经输入了一些文本,但尚未按下
输入
。用户必须删除其待处理条目,并为新问题输入新答案。我不知道有什么干净的方法来避免这种尴尬,因为没有可靠的方法来中断
nextInt()
调用。

它可能很蹩脚,但如果我在问了一个问题后启动一个新线程,调用wait(timeout),在新线程中我将等待答案,在收到答案后,我将在父线程中的对象上调用notify()。它会起作用吗?您可以使用
等待
通知
来推出自己的解决方案,但正如您所看到的,要正确使用它是很困难的。使用
BlockingQueue
大致相当,但它捆绑在一个干净、可靠的包中。我现在正在使用您的解决方案,我不明白一件事:我必须在t.start/t.interrupt之间设置所有循环,还是只设置输入读取部分?因为它似乎不像你在snuppet中写的那样工作。@Anton-你原来的
for
循环中的东西应该在新的循环中。这就是。。。是当你说它似乎不起作用,你能准确地描述你看到的吗?我希望在C++完成我现在的工作,并在星期一回到java,所以我会发布我的代码并告诉你我看到了什么。请不要离开这个线程,因为我需要你的帮助:)它可能是跛脚的,但如果我在提出问题后启动一个新线程,调用等待(超时),在新线程中我将等待答案,在收到答案后,我将调用父线程中对象的notify()。它会起作用吗?您可以使用
等待
通知
来推出自己的解决方案,但正如您所看到的,要正确使用它是很困难的。使用
BlockingQueue
大致相当,但它捆绑在一个干净、可靠的包中。我现在正在使用您的解决方案,我不明白一件事:我必须在t.start/t.interrupt之间设置所有循环,还是只设置输入读取部分?因为它似乎不像你在snuppet中写的那样工作。@Anton-你原来的
for
循环中的东西应该在新的循环中。这就是。。。是当你说它似乎不起作用,你能准确地描述你看到的吗?我希望在C++完成我现在的工作,并在星期一回到java,所以我会发布我的代码并告诉你我看到了什么。请不要留下这条线,因为我需要你的帮助:)