在线程中调用类的方法

时间:2011-01-30 11:31:14

标签: ruby multithreading

Class A
  def foo
    do s.t
  end
end

class B
  def initialize
    @bar = Thread::new{
      A::new
    }
    #Here I want to call A.foo in the thread @bar
  end
end

bar = B::new

我想用A类开始一个新线程。如何从B类调用方法foo?

1 个答案:

答案 0 :(得分:3)

我觉得你对你的问题感到困惑。首先,你说

  

我想用A类开始一个新线程

但目前还不清楚你的意思。你不能用'类'开始一个线程。其次,你说

  

这里我想在线程@bar

中调用A.foo

但是你不在那个新线程中正在执行的块内。即使你是,也没有A类的类方法'foo',所以A.foo只会产生NoMethodError。然后你说你想要

  

从B类调用方法foo?

即使有关调用foo的注释位于B的实例中。

所以,我假设你的意思是:

Class A
  def foo
  end
end

class B
  def initialize
    @bar = Thread::new{
      a = A::new
    }
    # Here I want to call a.foo
  end
end
bar = B::new

现在,在这种情况下,您的问题是您创建的A的新实例是线程@bar执行的块的本地实例。它不是您创建的Thread实例的实例变量,您无法访问该实例的任何方法。但是,您可以做的是事先创建该实例并与线程共享:

class B
  def initialize
    a = A.new
    @bar = Thread::new {
      do_stuff_with a
    }
    a.foo
  end

这样可以正常工作。当然,你遇到了并发地狱以及通常与使用线程相关的所有问题。当心。