Java - 使用nextInt()时如何保持计时器运行

时间:2018-06-07 10:48:55

标签: java timer

我已经建立了一个测验,可以生成随机数学问题。在我的main方法中,我有一个使用System.currentTimeMillis()方法的while循环。在while循环中我使用Scanner对象中的nextInt()方法。这部分地阻止了计时器的工作。简而言之,我试图给用户10秒钟完成10个简单的数学问题。当计时器用完时我只想计算出用户的分数。请参阅代码以更好地了解我正在做的事情。

    int score = 0;
    Scanner input = new Scanner(System.in);
    QuizGenerator qg = new QuizGenerator();
    ArrayList<Question> quiz = qg.generateQuiz();

    long startTime = System.currentTimeMillis(); //fetch starting time
    while(false||(System.currentTimeMillis()-startTime)<10000) {
        for(Question q : quiz) {
            System.out.println(q.getQuestion());
            int playerAnswer = input.nextInt();
        }
    }
    System.out.println("You scored: " + score);

2 个答案:

答案 0 :(得分:0)

您可以通过使用java.util.Timer来完成此操作。例如,

 public class QuizeRunner{

    int score = 0;
    Scanner input = new Scanner( System.in );
    QuizGenerator qg = new QuizGenerator();
    ArrayList<Question> quiz = qg.generateQuiz();

    long startTime = System.currentTimeMillis(); //fetch starting time

    //timer
    Timer timer = new Timer();
    timer.schedule( new TimerTask()
    {
        @Override
        public void run()
        {
            if ( ( System.currentTimeMillis() - startTime ) / 1000 > 10 )
            {
                System.out.println( "time out !!. score " + score );
                System.exit( 0 );
            }
        }

    }, 1000, 1000 );


    //ask questions
    for ( Question q : quiz )
    {

        System.out.println( q.getQuestion() );
        int playerAnswer = input.nextInt();
    }

    System.out.println( "You scored: " + score );
 }

答案 1 :(得分:0)

问题是nextInt()是阻塞的,所以只有在知道有用户输入时才想调用它。试试这个:

int qIndex = 0;
System.out.println(quiz.get(qIndex++).getQuestion());
while((System.currentTimeMillis()-startTime)<10000) {
    if (System.in.available() > 0) {
         int playerAnswer = input.nextInt();
         // check answer..
         if(qIndex >= quiz.size()) break;
         System.out.println(quiz.get(qIndex++).getQuestion());
    }
    // Allow few milliseconds 
    Thread.sleep(100);
}