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

Kotlin线程间数据传递:线程S与W协作功能实现求助

Kotlin双线程状态同步倒计时实现修正

问题根源

原代码存在以下核心问题导致状态传递失败:

  1. ThreadS中的状态变量isTrue是局部变量,没有任何对外传递的逻辑,创建的Channel未被使用,导致ThreadW的channel.receive()一直阻塞
  2. ThreadW仅执行单次状态接收,未循环监听状态变化,无法响应ThreadS的状态切换
  3. 缺少倒计时到0时的线程终止逻辑

修正后的完整实现

ThreadS.kt

import kotlinx.coroutines.channels.Channel

class ThreadS(private val channel: Channel<Boolean>) : Thread() {
    override fun run() {
        var currentState = true
        try {
            while (!isInterrupted) {
                channel.send(currentState) // 发送当前状态到通道
                Thread.sleep(1000)
                currentState = !currentState
            }
        } catch (e: InterruptedException) {
            channel.close() // 线程中断时关闭通道
        }
    }
}

ThreadW.kt

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel

class ThreadW(private val channel: Channel<Boolean>) : Thread() {
    private var remainingSeconds = 30
    private var isCountingActive = false

    override fun run() {
        runBlocking {
            // 循环监听通道中的状态变化
            for (state in channel) {
                isCountingActive = state
                if (isCountingActive && remainingSeconds > 0) {
                    // 启动倒计时协程,每100ms递减一次
                    launch {
                        while (isCountingActive && remainingSeconds > 0) {
                            println("剩余时间: ${remainingSeconds}秒")
                            delay(100)
                            remainingSeconds -= 1
                            if (remainingSeconds == 0) {
                                // 倒计时结束,终止所有线程
                                channel.close()
                                Thread.currentThread().interrupt()
                                println("倒计时完成,所有线程已终止")
                            }
                        }
                    }
                }
            }
        }
    }
}

主函数

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel

fun main() = runBlocking {
    val stateChannel = Channel<Boolean>()
    val threadS = ThreadS(stateChannel)
    val threadW = ThreadW(stateChannel)

    threadS.start()
    threadW.start()

    // 等待倒计时线程结束后,中断状态切换线程
    threadW.join()
    threadS.interrupt()
}

关键逻辑说明

  • 状态传递:ThreadS通过传入的Channel每次切换状态前发送当前状态,确保ThreadW能实时感知状态变化
  • 倒计时控制:ThreadW通过循环监听通道状态,当状态为true时启动倒计时协程,状态变为false时自动暂停(协程循环条件不满足)
  • 终止处理:倒计时归0时关闭通道并中断线程,触发所有线程的终止逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:33:12