1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
require 'java'
class JRubyFuture
java_import java.util.concurrent.atomic.AtomicReference
java_import org.jruby.util.unsafe.UnsafeHolder
PENDING = Object.new
def initialize
@Value = AtomicReference.new PENDING
UnsafeHolder.fullFence
end
def complete?(value = @Value.get)
value != PENDING
end
def value
# read only once
value = @Value.get
return value if complete? value
JRuby.reference(self).synchronized do
# recheck is in the loop condition
until complete?(value = @Value.get)
# may wakeup spuriously, therefore kept in a loop
JRuby.reference(self).wait
end
end
value
end
def fulfill(value)
JRuby.reference(self).synchronized do
raise 'already fulfilled' if complete?
@Value.set value
JRuby.reference(self).notify_all
end
self
end
end
|