我正在做一个定时测验,每个问题都应该有一个计时器。
我希望我的代码输出一个问题 20 秒,并要求输入答案,当时间到时,应该显示问题 2。我被困在我应该做什么才能做到这一点,一个引用就足够了,我只是不知道该读什么,我正在使用 java.util.Timer
和 TimerTask
.
我也尝试过
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/