我是Ruby的新手,所以如果我错过了什么,我会道歉。我有一个类启动一个线程来执行一些内部缓存刷新。即使我加入线程并将其设置为nil,然后将所有类实例设置为nil,也不会处理该类。有没有人见过这个问题?我究竟做错了什么? 谢谢 丹尼尔
我的代表:
class KK
def initialize()
@thread = Thread.new(&method(:refresh_cache))
ObjectSpace.define_finalizer( self, self.class.finalize() )
end
def self.finalize()
proc {
puts 'Object KK Disposed'
}
end
def wait_thread
puts 'join thread'
@thread.join #also tried with exit and kill
@thread=nil
end
def refresh_cache
puts 'KK still here'
end
end
puts 'started'
puts Thread.list
k2=KK.new
puts ObjectSpace.each_object(KK).count
puts Thread.list
k2.wait_thread
k2=nil
puts 'After nil'
puts Thread.list
GC.start
sleep 5
#still one instance here
puts ObjectSpace.each_object(KK).count
答案 0 :(得分:0)
&foo
去了foo.to_proc
&method(:bar)
去了method(:bar).to_proc
method
,这是从Object
继承的实例方法,即它self.method(:bar).to_proc
。 self.method
生成一个绑定 Method
,它可以使绑定的接收者(自己)保持活动状态,并且当包含在proc中时它会一直这样做。
如果要将其转换为可以传递给线程而不保留实例的proc,则应该使用静态方法。