认为:
- 有一些对象(例如,数组
a
)和依赖于对象的条件(例如,例如a.empty?
)。 - 当前线程以外的一些线程可以操作对象(
a
),因此条件评估值的真实性会随着时间而变化。
如何让当前线程在代码中的某个时刻休眠并在满足条件时通过推送通知继续(唤醒)?
我不想做这样的投票:
...
sleep 1 until a.empty?
...
也许使用Fiber
将是一个线索。
认为:
a
)和依赖于对象的条件(例如,例如a.empty?
)。a
),因此条件评估值的真实性会随着时间而变化。如何让当前线程在代码中的某个时刻休眠并在满足条件时通过推送通知继续(唤醒)?
我不想做这样的投票:
...
sleep 1 until a.empty?
...
也许使用Fiber
将是一个线索。
也许我不太了解您的问题,但我想ConditionVariable
这是解决此类问题的好方法。
因此,ConditionVariable
可用于在发生某些事情时向线程发出信号。让我们来看看:
require 'thread'
a = [] # array a is empty now
mutex = Mutex.new
condvar = ConditionVariable.new
Thread.new do
mutex.synchronize do
sleep(5)
a << "Hey hey!"
# Now we have value in array; it's time to signal about it
condvar.signal
end
end
mutex.synchronize do
condvar.wait(mutex)
# This happens only after 5 seconds, when condvar recieves signal
puts "Hey. Array a is not empty now!"
end