【发布时间】:2018-07-20 21:54:08
【问题描述】:
我有一个线程从本地服务器接收数据包:
// Shared object:
@Volatile lateinit var recentPacket: Packet
val recvMutex = Object()
// Thread code:
thread(isDaemon = true) {
while (true) {
val packet = readPacket()
synchronized(recvMutex) {
recentPacket = packet
recvMutex.notifyAll()
}
}
}
我还有 多个 其他线程在等待数据包,每个线程都应该得到刚刚收到的相同数据包:
suspend fun receive() {
return synchronized(recvMutex) {
recvMutex.wait() // non-blocking alternative to this?
recentPacket
}
}
它可以工作,但是Object.wait() 阻塞了线程。有没有办法避免这种情况?
【问题讨论】:
-
wait() 的全部意义在于阻塞。这将有助于描述您尝试使用 wait() 调用做什么。据我了解,您希望一个生产者线程通知 n 个消费者线程收到相同的数据包?还是您希望 n 个线程拉出一个队列,队列中的每个任务最终仅由单个线程执行?
-
@Charlie:我想要 1 个生产者线程通知同一个数据包的 n 个消费者线程。我想要一些方法来暂停协程(不阻塞),直到另一个数据包到达(对不起,我不清楚)。
-
我只能从 Java 世界来描述它,但是您使用 Object.wait 不正确。 Javadoc(可能是 KDoc)描述了您应该如何使用它 - 您需要检查一个条件(例如,最近的数据包不为空,并且与您已经看到的不同)并且仅当该条件不满足,您应该等待(在
while循环中),然后在wait之后再次检查现在是否满足条件。 -
@StephenC
receive()的调用者是协程。 -
其他线程在收到物品之前究竟会做什么?他们是否运行事件循环?
标签: multithreading kotlin coroutine