我正在编写一个测试系统,我要做的就是计算用户在此问题上花费了多少秒。即我打印问题(标准System.out.println),然后等待5秒钟,如果用户在这5秒钟内(通过标准输入)回答了此问题,我想保留此值。
如果用户在5秒钟内未提供答案,则必须跳过此问题并继续。
问题是我正在通过Scanner
对象读取用户答案in.nextInt()
,我想这是不可控制的。
我怎么解决这个问题?这是没有该功能的代码片段,您能给我一些提示添加什么吗?
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.");
}
在这种情况下,我将使用两个线程。主线程编写问题,等待答案,并保持得分。子线程可能会通过读取标准输入,并将答案发送到主线程BlockingQueue
。
通过使用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();
如果此调用返回null
,则主线程知道子线程在这段时间内未收到任何输入,并且可以适当地更新分数并打印下一个问题。
该ReaderThread
会是这个样子:
class ReaderThread extends Thread {
private final BlockingQueue<Integer> answers;
ReaderThread(BlockingQueue<Integer> answers) {
this.answers = answers;
}
@Override
public void run() {
Scanner in = new Scanner(System.in);
while (!Thread.interrupted())
answers.add(in.nextInt());
}
}
在上使用时System.in
,Scanner
将一直阻塞,直到用户按下为止Enter
,因此Enter
当主线程超时并移至下一个问题时,用户可能输入了一些文本但尚未按下该文本。用户将不得不删除他们的待处理条目,并为新问题输入新答案。我不知道如何解决这种尴尬,因为没有可靠的方法来打断nextInt()
电话。
问题内容: 我使用的是Python 3,我想编写一个程序,在一定时间内要求多个用户输入。这是我的尝试: 问题是,即使时间到了,代码仍然等待输入。我希望循环在时间用完时停止。我该怎么做呢?谢谢! 问题答案: 此解决方案与 平台无关, 并且会 立即 中断键入以告知有关现有超时的信息。不必等到用户按下ENTER键就可以发现发生了超时。除了及时通知用户之外,这还可以确保在进一步处理超时后不再输入任何内容。
我使用处理器API创建kafka流媒体应用程序。 下面是我如何创建一个主题,将时间戳附加到所有传入消息 Kafka主题。sh--创建--zookeeper localhost:2181--复制因子1--分区1--主题topicName--配置消息。时间戳。类型=创建时间 工作流处理来自源主题的传入消息并将其发布到接收器主题。出于某种奇怪的原因,我在源主题和接收器主题消息中看到了相同的时间戳。例如,
问题内容: 我需要帮助在特定时间(如下午2点)在服务器上运行Java程序(以索引新文件)。 有人告诉我Java有一些叫做Job的东西,但我不知道该如何使用。我尝试了这个: 但是有了这个程序仍在运行。 如何在指定时间运行程序? 问题答案: 有一个名为Quartz的API ,您的程序可以在其中调度“作业”,并在该时刻运行它。 在给出示例之前,请尝试使用此链接。 编辑:首先,您必须创建一个实现org.q
问题内容: 我知道这个问题以前曾被问过,但我已不知所措。 我有一个警报管理器来设置通知: …然后我得到了通知本身即服务: } ....我加入了吐司,以确保我确实要使用此方法。敬酒,但通知没有。我在这里做错了什么?我需要更改清单文件中的内容吗? 问题答案: 没有图标(或标题是?)的通知将不起作用。 我确信我遇到了同样的问题,因为如果您忽略了通知的内容之一,则通知将不会显示。
问题内容: 我有一个Web应用程序,每小时与中央数据库同步四次。该过程通常需要2分钟。我想将此进程作为线程在X:55,X:10,X:25和X:40运行,以便用户知道在X:00,X:15,X:30和X:45他们有数据库的干净副本。这只是管理期望。我已经通过了执行器,但是调度是通过它完成的,我认为不能保证以小时为单位的实际运行时间。我可以使用第一个延迟来启动,以便第一个接近启动时间和每15分钟的计划,
我有一个数据库表(id、arrivalTime、flightNumber),并从该表中创建了一组代理。我想要一个行人出现在每个到达时间从一个目标线在模型。我(错误地)认为这将是轻而易举地使用时间表,但我没有运气。关于如何在AnyLogic中执行此操作有什么建议吗?