You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin中实现无用户输入X时间后执行指定操作?

Kotlin实现带输入超时提示的回显程序

原代码中readLine()是阻塞式调用,必须等待用户输入才会继续执行,因此无法实现超时自动提示的逻辑。要解决这个问题,我们需要将输入监听和超时检测分离开,这里提供两种可行方案:

方案1:使用线程池实现超时检测

利用ScheduledThreadPool来定时触发超时提示,用户输入时重置计时器:

import java.util.concurrent.Executors
import java.util.concurrent.ScheduledFuture
import java.util.concurrent.TimeUnit

fun main() {
    val scheduler = Executors.newScheduledThreadPool(1)
    var timeoutTask: ScheduledFuture<*>? = null
    val timeoutSeconds = 5 // 自定义超时时间X,单位:秒

    // 启动或重置超时检测任务
    fun restartTimeoutCheck() {
        timeoutTask?.cancel(false) // 取消当前未触发的超时任务
        timeoutTask = scheduler.schedule({
            println("Are you there?")
            restartTimeoutCheck() // 输出后继续监听下一次超时
        }, timeoutSeconds.toLong(), TimeUnit.SECONDS)
    }

    restartTimeoutCheck()

    while (true) {
        // 检查是否有输入数据可读,避免readLine()一直阻塞
        if (System.`in`.available() > 0) {
            val input = readLine()
            println(input)
            restartTimeoutCheck() // 用户输入后重置超时计时
        }
        Thread.sleep(100) // 短暂休眠,降低CPU占用率
    }
}

代码说明

  • ScheduledThreadPool负责定时执行超时提示任务,超时时间可通过timeoutSeconds调整
  • System.in.available()用于判断是否有用户输入,避免readLine()阻塞主线程
  • 每次用户输入后,取消当前的超时任务并重新启动计时

方案2:使用Kotlin协程实现(更简洁)

利用Kotlin协程的非阻塞特性,实现更优雅的超时控制:

import kotlinx.coroutines.*
import java.util.concurrent.TimeUnit

fun main() = runBlocking {
    val timeoutMillis = 5000 // 自定义超时时间X,单位:毫秒
    var timeoutJob: Job? = null

    // 启动或重置超时任务
    fun restartTimeout() {
        timeoutJob?.cancel()
        timeoutJob = launch {
            delay(timeoutMillis)
            println("Are you there?")
            restartTimeout() // 持续监听超时
        }
    }

    restartTimeout()

    while (true) {
        if (System.`in`.available() > 0) {
            val input = readLine()
            println(input)
            restartTimeout()
        }
        delay(100) // 降低轮询频率,减少资源消耗
    }
}

注意事项

  • 协程版本需要添加依赖:在Gradle中添加implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")(可替换为最新版本)
  • System.in.available()在部分终端环境下可能存在兼容性问题,若遇到异常,可改用线程中断readLine()的方式实现

内容的提问来源于stack exchange,提问作者Bernardo Martins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:01:23