如何在Java的for循环中实现计时器?乘法游戏卡顿问题求助
乘法游戏计时卡顿问题修复
开发带计时功能的乘法游戏时,每轮设置5道题目,要求玩家3秒内作答,使用Timer和TimerTask实现计时后,出现超时程序卡顿、无法进入下一轮循环的问题。
问题根源
Scanner.nextInt()是阻塞方法,超时后TimerTask仅打印提示,但无法中断主线程的输入等待,导致程序卡在输入环节无法推进。- 原代码中的输入处理逻辑错误,重复调用
nextInt()会引发不必要的输入读取或异常。 Timer.cancel()仅终止定时器任务,无法解除主线程的阻塞状态。
修复后代码
import java.util.Random; import java.util.Scanner; public class GameLogic { private static int score = 0; public static void playGame() { Scanner keyboard = new Scanner(System.in); int roundCount = 5; for (int i = 1; i <= roundCount; i++) { // 生成随机乘法题目 Random random = new Random(); int firstNum = random.nextInt(9) + 1; int secondNum = random.nextInt(9) + 1; int multiply = firstNum * secondNum; System.out.printf("%n第%d题:%d X %d%n", i, firstNum, secondNum); boolean answeredInTime = false; int answer = 0; // 3秒超时等待输入 keyboard.hasNextInt(3000); if (keyboard.hasNextInt()) { answer = keyboard.nextInt(); answeredInTime = true; } else { System.out.println("时间到!"); // 清除缓冲区无效输入,避免影响下一题 keyboard.nextLine(); } // 判定答案并更新分数 if (answeredInTime) { if (answer == multiply) { System.out.println("答对了!"); score += 20; } else { System.out.println("答错了!"); } } } System.out.printf("%n游戏结束!你的总得分:%d分%n", score); keyboard.close(); } public static void main(String[] args) { playGame(); } }
关键修改说明
- 移除
Timer和TimerTask,改用Scanner.hasNextInt(3000)实现3秒超时等待,该方法会在指定时间内等待输入,超时后返回false,彻底避免主线程阻塞。 - 超时后调用
keyboard.nextLine()清除缓冲区的无效输入,保证下一题的输入读取不受影响。 - 增加题目序号显示和最终得分统计,优化游戏体验。
- 统一使用单个
Random实例,避免重复创建对象浪费资源。
内容的提问来源于stack exchange,提问作者Rlohaustralia
相关产品推荐
相关产品推荐

