Value Change Sensitivity

How do I do something like this :

i = 0
a = Thread.new {
  i.valueChange { | val | puts "i is now #{val} }
}
b = Thread.new {
   i = 2 # => "i is now 2"
}
a.join
b.join

The idea is everytime the value of i changes, the block associated
with i gets executed