如何实现用户输入重置Timer,无输入1分钟后终止程序?
实现带输入重置功能的超时终止程序
核心思路
- 多线程分离输入监听与计时逻辑:输入操作是阻塞的,单独开辟线程处理,避免阻塞计时任务执行。
- 用
ScheduledExecutorService替代Timer:提供更灵活的任务调度能力,支持随时取消和重新调度超时任务。 - 输入触发计时器重置:每次捕获到用户输入,立即取消当前计时任务,重新启动60秒倒计时。
完整实现代码
import java.util.Scanner; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class InputTimeoutProgram { // 调度器用于执行计时任务 private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // 用于跟踪当前的计时任务,方便取消重置 private static ScheduledFuture<?> timeoutTask; // 超时时间设置为60秒 private static final int TIMEOUT_SECONDS = 60; public static void main(String[] args) { // 启动初始计时器 resetTimer(); // 启动输入监听线程 Thread inputThread = new Thread(() -> { Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请输入内容(60秒无输入程序将终止):"); // 阻塞等待用户输入 String input = scanner.nextLine(); // 输入不为空则重置计时器 if (input != null && !input.trim().isEmpty()) { System.out.println("收到输入:" + input); resetTimer(); } } }); inputThread.start(); } /** * 重置计时器:取消当前任务,重新调度新的超时任务 */ private static void resetTimer() { // 如果已有计时任务,先取消 if (timeoutTask != null && !timeoutTask.isCancelled()) { timeoutTask.cancel(false); } // 调度新的超时任务,延迟60秒后执行 timeoutTask = scheduler.schedule(() -> { System.out.println("\n60秒无输入,程序终止"); // 终止程序 System.exit(0); }, TIMEOUT_SECONDS, TimeUnit.SECONDS); } }
关键代码说明
ScheduledExecutorService调度器:单线程调度池保证计时任务串行执行,避免线程安全问题。- 输入线程:通过
Scanner监听控制台输入,每次输入完成后调用resetTimer()重置倒计时。 resetTimer()方法:负责取消当前未完成的计时任务,重新启动60秒倒计时,确保每次输入后超时时间重新计算。- 超时处理:计时任务触发时,打印提示信息并调用
System.exit(0)终止程序。
内容的提问来源于stack exchange,提问作者cheesecakefactory
相关产品推荐
相关产品推荐

