java - 在java上用定时器做一个测验

标签 java timer

我正在做一个定时测验,每个问题都应该有一个计时器。

我希望我的代码输出一个问题 20 秒,并要求输入答案,当时间到时,应该显示问题 2。我被困在我应该做什么才能做到这一点,一个引用就足够了,我只是不知道该读什么,我正在使用 java.util.TimerTimerTask.

我也尝试过

ExecutorService 但我只看到它在计时器后关闭的示例,我需要在计时器结束后发布另一个问题,而不是关闭程序,因为我需要每个问题的时间限制而不是整个测验的计时器。

我试过了

if(seconds<=20)
{
    question1();
}
else if (seconds<=40||seconds>=21)
{
    new ProcessBuilder("cmd","/c","cls").inheritIO().start().waitFor();
    question2();
}

我也尝试过使用 while

while(seconds<=20){
    question1();
}
while(seconds<=40||seconds>=21){
    new ProcessBuilder("cmd","/c","cls").inheritIO().start().waitFor();
    question2();
}

这就是我的提问方法。

public static void question2(String... args) throws 
    IOException, InterruptedException
{  
    System.out.println("");
    System.out.printf("%72s\n","QUIZ FOR PHILIPPINE HISTORY");
    System.out.println("");
    System.out.printf("%64s\n","Question #2");
    System.out.println("");
    System.out.println("\t\t\t\t\t     WHO DISCOVERED PHILIPPINES?");
    System.out.println("\n\t\t\t\t\t\tA. Fernando Magellan");
    System.out.println("\t\t\t\t\t\tB. Ferdinand Megallan");
    System.out.println("\t\t\t\t\t\tC. Ferdinand Magellan");
    System.out.println("\t\t\t\t\t\tD. Fernando Poe");

    System.out.println("\n\t\t\t\t\t\tTYPE YOU ANSWER HERE: ");
    char answer2 = a.nextLine().charAt(0);
    switch (sagot2)
    {
        case 'B':
        case 'b':
            score++;
            seconds = 21;
            System.out.print("You are CORRECT!");
            break;
        default:
            System.out.print("You are WRONG");
            seconds = 21;
            break;
    }
}

这是我的代码的开头加上计时器和计时器任务。

import java.util.Timer;
import java.util.TimerTask;
import java.util.Scanner;
import java.io.IOException;
public class q2 {
static int seconds = 0; 
static Scanner a=new Scanner(System.in);
static Timer timer = new Timer();
static int number = 1;
static int score = 0;
public static void mema(){
    TimerTask task = new TimerTask () 
    {
        public void run() 
        {
            seconds++;
            System.out.print(seconds);
        }
    };

    timer.schedule(task,1000,1000);
}   

我也尝试过使用这个,但 5 秒后它没有执行其他方法。

long start = System.currentTimeMillis();
long wait = 5000;
long end = start + wait;
long end1 = end + wait;

while (System.currentTimeMillis() < end)
{
question1();
}
while (System.currentTimeMillis() < end1 || System.currentTimeMillis() > end)
{
question2();
}

最佳答案

您所做的各种事情使您的代码变得比应有的更加复杂。

首先,避免修复细节,例如“这是第一个问题”与“这是第二个问题”。

相反:专注于您需要的基本元素。在您的情况下:您想要在一定时间内显示问题。之后,程序应该显示另一个问题 - 或者可能给出总结和结束。

因此:编写一个类/方法,只提出一个问题,然后等待。然后思考如何重新使用该代码来按顺序提出任意数量的问题。

对于“时机”:鉴于您是初学者,我建议您此时不要使用“完全多线程”(即:任务和调度程序)。相反,“等待一段时间”可以通过以下方式轻松实现

  • 获取当前时间
  • 结束时间 = 当前时间 + 20 秒
  • 循环直到到达结束时间

事情是这样的:你通过探索你的选择和尝试很多东西来学习编程。因此我给了你提示 - 而不是代码。

关于java - 在java上用定时器做一个测验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48300584/

相关文章:

Java:在单个声明中注释成员

java - 如何嵌入我的秒表

Java方法访问

使用 DTO 和 HashMap 的 Java 服务器端表单验证

java - 通过单击按钮更改 JFrame 颜色

android - 为后台任务选择哪一个 - 具有重复任务的计时器或具有循环的服务?

javascript - 使用nodejs在一定时间后运行函数/代码

Java Ant - 错误 [main] - 无法实例化名为 "DC"的 auxFacto-ry

android - 如何添加通知计时器,例如 whatsapp 来电通知?

java - 在 libgdx 中暂停 TimeUtils