2013-07-14 92 views
3

假设:醒来通过推送通知

  • 有一些物体(例如,阵列a)和依赖于物体上的条件(例如,如a.empty?)。
  • 除当前线程以外的某些线程可以操作对象(a),因此条件的评估值的真实性随时间而变化。

如何让当前线程在代码中的某个点处休眠,并在条件满足时通过推送通知继续(唤醒)?

我不想做轮询是这样的:

... 
sleep 1 until a.empty? 
... 

也许使用Fiber将是一个线索。

+1

无论条件是什么,编写一个钩子,任何时候调用您的行为都会调用它。它可以容纳当时可以处理的一组对象,可能是线程或光纤。这可能与[本项目](https://github.com/kristinalim/ruby_hooks)相似 – vgoff

回答

3

也许我不太明白你的问题,但我想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 
+0

谢谢。太棒了。 – sawa