扩展Thread类

时间:2012-09-27 08:22:57

标签: ruby ruby-on-rails-3

使用 Ruby 1.8.7 我试图在这里扩展Thread类是片段

class Foo < Thread
  attr_accessor :bar
end

t = Foo.new do 
  puts "Foo thread begins"
  self.bar = "Bar value" # also tried @bar
  sleep(2)
  puts "Foo thread ends"
end

puts "Value: #{t.bar}"
sleep(10)
puts "Value: #{t.bar}"

输出

>Foo thread begins
>Value: 
>Foo thread ends
>Value:

为什么我无法看到:bar课程的Foo属性?由于这可能不是以这种方式工作,如何将值从新创建的Thread传递到main线程?

谢谢

2 个答案:

答案 0 :(得分:2)

线程中的

self引用主对象,而不是t。由于方法bar=未在主对象上定义,因此会抛出错误,该错误不会发送到主线程。

您可以通过多种方式访问​​该主题:

1)Foo.new{p Foo.current}

2)Foo.new{|foo| p foo}

3)foo = Foo.new{p foo}

答案 1 :(得分:1)

你不需要扩展线程,你可以尝试下面的。

class Foo
  attr_accessor :bar

  def run
    Thread.new do
      puts "Foo thread begins"
      self.bar = "Bar value" # also tried @bar
      sleep(2)
      puts "Foo thread ends"
    end
  end
end

t = Foo.new
t.run

puts "Value: #{t.bar}"
sleep(10)
puts "Value: #{t.bar}"