Kotlin线程间数据传递:线程S与W协作功能实现求助
Kotlin双线程状态同步倒计时实现修正
问题根源
原代码存在以下核心问题导致状态传递失败:
ThreadS中的状态变量isTrue是局部变量,没有任何对外传递的逻辑,创建的Channel未被使用,导致ThreadW的channel.receive()一直阻塞ThreadW仅执行单次状态接收,未循环监听状态变化,无法响应ThreadS的状态切换- 缺少倒计时到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
相关产品推荐
相关产品推荐

